文章详情

  • 游戏榜单
  • 软件榜单
关闭导航
热搜榜
热门下载
热门标签
php爱好者> php文档>中断用到的同步技术

中断用到的同步技术

时间:2010-07-23  来源:ymcheng

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

相关阅读 更多 +
排行榜 更多 +
辰域智控app

辰域智控app

系统工具 下载
网医联盟app

网医联盟app

运动健身 下载
汇丰汇选App

汇丰汇选App

金融理财 下载