Linux kernel 在中断处理程序中禁用本地中断(获取锁)怎么可能导致双获取死锁?

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()函数没有禁用本

在Linux内核开发书(Robert Love)中提到:

在中获得自旋锁之前,必须禁用本地中断 中断处理程序。否则,中断处理程序是可能的 在锁定时中断内核代码并尝试 重新获取锁。这最终会导致双重收购 僵局

现在我的疑问是:

  • 通常,do_IRQ()是否禁用本地中断
  • 如果lock是acquire,这意味着
    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
    为零时,表示内核可以安全地进行进程切换,否则不会