|
楼主 |
发表于 2003-6-15 10:52:47
|
显示全部楼层
http://63.249.85.132/kern_code_walk.htm
该网址对FreeBSD中断处理流程讲的比较清楚了,别的必须看code理解....
汗!以前只是看了一遍,当时由于看FreeBSD5.x版和4.x版差别比较大,没有认真看。
就COM口,而言,我需要捕获MSR的改变引起的中断。因此,我先在kernel启动阶段,发现COM口会attach这个硬件(sioattach),我设置中断级别,使其缺省就支持第4级别的中断类型。别的,其实FreeBSD已经都做了,如果我们要针对MSR引起的中断做我们自己的处理,根据自己的实际情况,将要处理的中断分为两个部分,必须马上处理的,和可以滞后处理的。在相应的ISR里的一段code
[code:1]if (modem_status != com->last_modem_status) {
....
}[/code:1]
我们要做的事情就在这个if里,添加自己的code,包括设置软中断pending...
FreeBSD通过softtty()设置COM口的软pending标志,在硬中断处理完后,会检查相应的bit,看是否需要软中断处理。而软中断控制路径是在内核发现硬件,attach他们的时候,如果需要,通过register_swi注册相应的软中断路径。
汗...其实上面的那个网址写的更好,更全面,更深入....
提一句,FreeBSD在I386体系中,建立名为nexus的伪根设备,所有的硬件、总线都依附在下面,成一个树状结构,好比我的COM口,需要irq,port,IDT的一个表项,这些,都是通过向它的父级isa申请,isa再向它的父级申请。
[code:1]DRIVER_MODULE(sio, isa, sio_isa_driver, sio_devclass, 0, 0);[/code:1]
最终通过nexus_xxx实现真正的分配。比如注册中断,最终在nexus_setup_intr函数里,通过调用inthand_add函数添加,再间接调用icu_setup函数update IDT内容。 |
|