-------------------------------------------
本文系本站原创,欢迎转载!
转载请注明出处:http://ymcheng.cublog.cn
------------------------------------------
1. do_IRQ():
irq_enter() /*对preempt_count字段加1。其实是在隐含关闭软中断*/
handle_irq()-------->:irq_enter()
irq_exit()/*减1*/ local_irq_disable()/关中断/
__do_IRQ()
irq_exit()
__do_IRQ()------>(SMP) spin_lock()/*对IRQ_desc加锁*/
spin_unlock()/*开锁*/
handle_IRQ_event()------>local_irq_enable_in_hardirq() spin_lock() do_while做*action()
spin_unlock() local_irq_disable()
注意粗体local_irq_disable(),后面没有显式开本地中断,为什么?源码中的原话是:Note that we do not explicitly enable interrupts afterwards - some MILO PALcode (namely LX164 one) seems to have severe problems with RTI at IPL 0。不是很理解为什么这样做。
2. do_softirq():
in_interrupt()/*这里其实跟上面irq_enter()一样,看软中断是否禁掉或则已经执行了do_softirq()*/
local_irq_save()
call_on_stack()----------->__do_softirq():
local_irq_restore() __local_bh_disable()/*与in_interrupt()对应,关软中断。即一个软中断不会抢占另一个软中断*/ local__irq_enable()/*打开本地中断,一个中断处理程序可以抢占软中断*/ do_while处理软中断句柄
local_irq_disable()
local_bh_enable()/*开软中断*/
3. tasklet_action()/tasklet_hi_action():
local_irq_disable()/*禁掉本地中断是为了对tasklet链表操作*/
local_irq_enable()/*与上面配对*/
while循环------------------------------------------------->tasklet_trylock()/*因为不同tasklet(SMP)可能共享数据*/
local_irq_disable()/*同上*/ 执行tasklet句柄
local_irq_enable()/*同上*/
tasklet_unlock()
看这段流程最好参考源码。还有工作队列,没弄懂。水平有限,欢迎拍砖.
("---------->"表示这段代码执行过程,注意是对齐分层的)
这个就是以源码中的处理流程来的。可以对照2.6.27.45中的/kernel/softirq.c和/kernel/irq/handle.c
阅读(1597) | 评论(0) | 转发(0) |