中断处理期间禁用中断

时间:2015-09-27 20:50:56

标签: operating-system interrupt interrupt-handling

为什么在内核当前正在处理中断时禁用中断?

如果错过了携带重要消息的中断怎么办?

2 个答案:

答案 0 :(得分:4)

这可以防止"堆叠中断"可以溢出内核堆栈。它还可以防止死锁和/或"固定"。

大多数硬件都不会丢失"一个中断。在中断期间,CPU"中断标志"被清除,但中断控制器[一个单独的野兽]仍然可用/启用以记录新的中断。如果CPU正在处理hardware_A的中断(在"中断服务程序" ISR_A中),则仍然可以断言hardware_B的中断。它将被[中断控制器]记住,它当时不会中断CPU。当ISR_A返回时,中断标志在退出时重新启用,现在,立即进入ISR_B(其调用堆栈帧将从与ISR_A相同的确切内存位置开始)。

虽然中断不会被丢失/丢弃,但ISR应该短[快速执行]以最小化延迟。换句话说,ISR_A不应该花费太长时间,以至于hardware_B会溢出一些内部状态/缓冲区[因为它在等待ISR服务时继续累积数据]。

最小化延迟是精心设计内核和ISR设计的一部分。在Linux中,ISR可以分解为ISR部分和下半部分"或者" tasklet"部分。 ISR [禁止中断]执行服务/静默设备所需的最小值(例如,清除设备中的某个位以防止它立即重新置位中断)。

然后启用其相应的tasklet [在启用中断的情况下运行]执行可能需要更长时间的更繁重的操作。尽管名称不同,但是不像完整的任务/进程那样出现在" ps"中。它们是一种[非常]轻量级/高效的方式来分割ISR必须完成的工作,以最大限度地减少延迟。

答案 1 :(得分:2)

我们来看看每个问题。

当内核当前处理中断时,为什么禁用中断?

虽然有许多类型的中断,例如I / O,定时器,看门狗,串行端口,外设和DMA,但我们以I / O为例。我们将讨论一个原始案例并将其扩展到内核中。

想象一下火灾报警/传感器位0/1连接到CPU的特定中断引脚。 0是正常状态,1是火!然后,可以将输入的中断配置为“电平触发”。传感器触发1时,ISR必须执行相关代码以警报或自动拨打消防部门。一旦进入ISR,通常应该清除中断。如果没有清除,硬件将继续中断CPU,ISR内部的安全代码将永远不会执行。

此外,CPU需要维护其当前执行状态的堆栈。重复出现的中断使其成为一种复杂的情况。

“边沿触发”或“触发转换”的第二个例子想象一下输入线/引脚(NRZ编码)上会出现一系列位。如果ISR的工作是将这些位组装成字(8,16,32,无论长度如何),我们需要清除中断,将该位组装到缓冲区中,并在周期内再次启用中断。不清除中断会导致毛刺y转换仅将1位误认为2位。

因此,设置并启用中断,如果中断,清除它,执行ISR代码并在相关的任何地方启用中断。

<强>内核

内核本身是一个关键的代码和调度程序(也是OS定时器,OS时钟)依赖于硬件定时器中断。包含中断逻辑的CPU的硬件部分维护状态转换。它还具有用于启用,禁用,屏蔽和设置中断优先级的硬连线逻辑。

如果内核模块或潜水员模块应安全执行代码,则只能通过在执行处理程序之前禁用中断来获取确定性行为

如果错过了带有重要信息的中断怎么办?

中断处理不应太长(在启用中断之前)。应该根据中断的频率和处理程序的复杂性来正确设计代码。