linux-kernel - 不禁用中断处理程序(获取锁)中的本地中断如何导致双重获取死锁?

标签 linux-kernel kernel linux-device-driver

在 Linux Kernel Development book (Robert Love) 中,提到:

we must disable local interrupts before obtaining spinlock in interrupt handler. Otherwise it is possible for an interrupt handler to interrupt kernel code while the lock is held and attempt to re-acquire the lock. Which finally can lead to double-acquire deadlock.

现在我的疑问是:

  1. 一般来说,do_IRQ() 不是禁用本地中断吗?
  2. 如果获得锁,则意味着preempt_count 变量不为零,这使得其他处理程序不应该有机会,因为内核不是preempt_safe。那么其他中断处理程序如何在这种情况下工作?

最佳答案

首先,do_IRQ()函数并没有关闭本地中断,而是一些用汇编语言编写的函数关闭了,这就是中断入口。之后,在执行通过request_irq() 注册的中断函数之前,在函数handle_IRQ_event() 中也通过request_irq() 传递的标志是与IRQF_DISABLED比较,判断在执行中断函数时是否开启本地中断。因此,第一个问题的答案取决于您传递给 request_irq() 函数的标志。

其次,preempt_count 只是表示进程上下文中的内核抢占,而不是中断。为避免中断处理程序在 UP 中执行,唯一的方法是使用 irqs_disable()。当preempt_count为零时,表示内核可以安全地进行进程切换,否则不能。

关于linux-kernel - 不禁用中断处理程序(获取锁)中的本地中断如何导致双重获取死锁?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22395248/

相关文章:

android -/proc/slabinfo 提供什么信息?

c - Linux 上的 ASLR 限制

linux - 获取打开文件描述符的内存使用情况

linux - 管道如何工作?

linux - outb() 在 LDD3 示例短模块中不起作用

linux - 如何在 Linux 中添加超过 4 个串行 tty 设备?

c - 编写我自己的 init 可执行文件

c - DMA 传输到 Linux 中的从属 PCI 设备

python - 内核错误[无法启动内核]

linux 内核 ip_options_build() 函数