【问题标题】: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。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-09-14
      • 1970-01-01
      • 2016-01-24
      • 2015-05-09
      • 2022-08-24
      相关资源
      最近更新 更多