中断处理程序可以被同一个中断处理程序抢占吗?

Har*_*man 6 linux-device-driver linux-kernel

在调用中断处理程序之前,CPU是否禁用本地CPU上的所有中断?或者它是否只禁用正在服务的特定中断线?

gby*_*gby 5

x86 在跳转到中断向量之前禁用所有本地中断(当然 NMI 除外)。Linux 通常会屏蔽特定中断并重新启用其余中断(未屏蔽的中断),除非将特定标志传递给中断处理程序注册。

请注意,虽然这意味着您的中断处理程序不会与同一 CPU 上的自身竞争,但它可以并且将会与在 SMP/SMT 系统中的其他 CPU 上运行的自身竞争。

  • 不严格的硬件行为 - 这个问题是在 Linux 内核的上下文中提出的。LAPIC 行为是可编程的,但这就是 Linux 对其进行编程的方式 - 所有中断都具有相同的优先级,因此一个中断另一个会阻塞,但 Linux 在软件中甚至在中断处理程序运行之前就可以非常快速地重新启用中断。 (2认同)
  • 随后,我在“Intel 64 和 IA-32 Arch. 软件开发人员手册”第 14 页中找到了有关“默认”x86 硬件行为的参考资料。6-10卷。1:“如果通过中断门调用中断或异常处理程序,处理器会清除 EFLAGS 寄存器中的中断使能 (IF) 标志,以防止后续中断干扰处理程序的执行。” 感谢您澄清有关 Linux 的问题。 (2认同)