软中断的重入

来源:互联网 发布:高能金域名都开盘价 编辑:程序博客网 时间:2024/05/17 03:59

一般情况下,在硬件中断处理程序后都会试图调用do_softirq执行软中断,
但是如果发现现在已经有中断在运行,或者已经有软中断在运行,则
不再运行自己调用的中断。也就是说,软中断是不能进入硬件中断部分的,并且软?br>卸显谝桓鯿pu上是不可重入的,或者说是串行化的(serialize)

其目的是避免访问同样的变量导致竞争条件的出现。在开中断的中断处理程序中不
允许调用软中断可能是希望这个中断处理程序尽快结束。

这是由do_softirq中的


if (in_interrupt())

return;


保证的.

其中,
#define in_interrupt() ({ int __cpu = smp_processor_id(); /
(local_irq_count(__cpu) + local_bh_count(__cpu) != 0); })

前者local_irq_count(_cpu)

当进入硬件中断处理程序时,handle_IRQ_event中的irq_enter(cpu,
irq)会将它加1,表明又进入一个硬件中断
退出则调用irq_exit(cpu, irq)

后者local_bh_count(__cpu)

当进入软中断处理程序时,do_softirq中的local_bh_disable()会将它加1,表明处于软中断中
local_bh_disable();

一个例子:

当内核正在执行处理定时器的软中断时,这期间可能会发生多个时钟中断,这些时钟中断的处理程序都试图再次运行处理定时器的软中断,但是由于
已经有个软中断在运行了,于是就放弃返回。

原创粉丝点击