在Linux内核开发书(Robert Love)中,提到:
我们必须在获得自旋锁之前禁用本地中断 中断处理程序否则可能是中断处理程序 在锁定并尝试时中断内核代码 重新获得锁定。这最终可以导致双重收购 死锁。
现在我怀疑是:
do_IRQ()
是否禁用本地中断? preempt_count
变量不为零,这使得没有其他处理程序可以获得机会,因为内核不是preempt_safe
。那么在这种情况下其他中断处理程序如何工作呢?答案 0 :(得分:2)
首先,do_IRQ()
函数dosn禁用本地中断,但是用汇编语言编写的某些函数会执行,即中断入口。然后,在执行request_irq()
注册的中断函数之前,在函数handle_IRQ_event()
中,还将request_irq()
传递的标志与IRQF_DISABLED
进行比较,以确定是否应启用本地执行中断功能时中断。因此,问题1的答案取决于您传递给request_irq()
函数的标志。
其次,preempt_count
只意味着进程上下文中的内核抢占,而不是中断。为了避免在UP中执行中断处理程序,唯一的方法是涉及irqs_disable()
。当preempt_count
为零时,它表示内核可以安全地进行过程切换,否则不行。