清除 linux 内核中的挂起中断

clear pending interrupts in linux kernel

假设我有一些代码如下:

local_irq_disable();
...  // some interrupts come during this time
local_irq_enable();

在我调用 local_irq_enable() 之后,所有被阻止的中断(挂起的中断)仍然存在并导致 cpu 响应。 有什么可以清除挂起的中断吗? 我的代码在 ARM aarch64 机器上运行。

一个典型的链是 cpu 中断引脚通过中断控制器(例如 GIC)多路复用到一组设备。

禁用中断只是分流CPU上的引脚,中断控制器仍然保持挂起状态。您可以使用中断控制器上的功能来屏蔽所有中断,这样您就可以在不接收任何中断的情况下启用 CPU 中断。不太确定这一点,当你可以让 CPU 忽略中断时。

要真正清除挂起的中断,您需要为每个具有挂起中断的设备调用设备特定代码(即中断处理程序)。您可以查看 GIC 的状态位,识别每个挂起的中断,然后查看内核的中断结构以确定相关设备并调用其处理程序。重新打开中断要容易得多。

如果您禁用中断,可能会有一个挂起的中断已从 PIC 发送到您的 CPU,等待您确认。因此,在 re-enable 中断之前,您必须告诉 PIC de-assert 此中断(如果存在)。

当 PIC 等待确认时,它可能一直在缓冲其他中断(或将它们发送给其他 CPU)。因此,您需要告诉 PIC 清除这些中断(如果存在),或者等待足够的时间让其他 CPU 处理所有这些中断。当然,这是假设中断是均匀分布的,并且没有中断偏向您的CPU。