首页 > 解决方案 > 清除linux内核中的挂起中断

问题描述

说我有一些代码如下:

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

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

标签: linuxlinux-kernelkernelinterruptinterrupt-handling

解决方案


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

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

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


推荐阅读