Linux kernel 在中断处理程序中禁用本地中断(获取锁)怎么可能导致双获取死锁?
在Linux内核开发书(Robert Love)中提到: 在中获得自旋锁之前,必须禁用本地中断 中断处理程序。否则,中断处理程序是可能的 在锁定时中断内核代码并尝试 重新获取锁。这最终会导致双重收购 僵局 现在我的疑问是:Linux kernel 在中断处理程序中禁用本地中断(获取锁)怎么可能导致双获取死锁?,linux-kernel,kernel,linux-device-driver,Linux Kernel,Kernel,Linux Device Driver,在Linux内核开发书(Robert Love)中提到: 在中获得自旋锁之前,必须禁用本地中断 中断处理程序。否则,中断处理程序是可能的 在锁定时中断内核代码并尝试 重新获取锁。这最终会导致双重收购 僵局 现在我的疑问是: 通常,do_IRQ()是否禁用本地中断 如果lock是acquire,这意味着preempt\u count变量不是零,这使得其他处理程序都不应该有机会,因为内核不是preempt\u安全的。那么,在这种情况下,其他中断处理程序如何工作呢 首先,do_IRQ()函数没有禁用本
preempt\u count
变量不是零,这使得其他处理程序都不应该有机会,因为内核不是preempt\u安全的
。那么,在这种情况下,其他中断处理程序如何工作呢do_IRQ()
函数没有禁用本地中断,但是一些用汇编语言编写的函数禁用了本地中断,这就是中断入口。随后,在执行中断函数之前,通过request\u irq()
注册,在函数handle\u irq\u event()
中,将通过request\u irq()
的标志与IRQF\u DISABLED
进行比较,以确定在执行中断函数时是否应启用本地中断。因此,问题1的答案取决于传递给request\u irq()
函数的标志
其次,preempt\u count
仅表示进程上下文中的内核抢占,而不是中断。为了避免中断处理程序在UP中执行,唯一的方法是使用irqs\u disable()
。当preempt\u count
为零时,表示内核可以安全地进行进程切换,否则不会