Chinaunix首页 | 论坛 | 博客
  • 博客访问: 108403
  • 博文数量: 24
  • 博客积分: 1584
  • 博客等级: 上尉
  • 技术积分: 215
  • 用 户 组: 普通用户
  • 注册时间: 2010-07-16 08:59
文章分类
文章存档

2012年(1)

2011年(2)

2010年(21)

分类: LINUX

2010-07-23 14:32:54

-------------------------------------------
本文系本站原创,欢迎转载!
转载请注明出处:
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


阅读(1547) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~