【问题标题】:clear pending interrupts in linux kernel清除linux内核中的挂起中断
【发布时间】:2020-11-27 13:08:40
【问题描述】:
假设我有一些代码如下:
local_irq_disable();
... // some interrupts come during this time
local_irq_enable();
在我调用 local_irq_enable() 之后,所有被阻塞的中断(挂起的中断)仍然存在并导致 cpu 响应。
有什么可以清除挂起的中断吗?
我的代码在 ARM aarch64 机器上运行。
【问题讨论】:
标签:
linux
linux-kernel
kernel
interrupt
interrupt-handling
【解决方案1】:
典型的链是 cpu 中断引脚通过中断控制器(例如 GIC)多路复用到一组设备。
禁用中断只是将 CPU 上的引脚分流,中断控制器仍然保持挂起状态。您可以使用中断控制器上的功能来屏蔽所有中断,这将允许您随后启用 CPU 中断而不接收任何中断。不太确定这一点,什么时候可以让 CPU 忽略中断。
要真正清除挂起的中断,您需要为每个具有挂起中断的设备调用特定于设备的代码(即中断处理程序)。您可以查看 GIC 的状态位,识别每个挂起的中断,然后查看内核的中断结构以确定相关设备并调用其处理程序。重新打开中断要容易得多。
【解决方案2】:
如果您禁用中断,可能会有一个挂起的中断从 PIC 发送到您的 CPU,它正在等待您确认。因此,在重新启用中断之前,您必须告诉 PIC 取消断言此中断(如果存在)。
当 PIC 等待确认时,它可能正在缓冲其他中断(或将它们发送到其他 CPU)。因此,您需要告诉 PIC 清除这些(如果存在),或者等待足够的时间让其他 CPU 处理所有这些中断。这当然是假设中断是均匀分布的,并且没有中断偏向您的 CPU。