中断屏蔽:为什么?

时间:2011-02-07 00:26:03

标签: operating-system computer-architecture interrupt

我正在读中断。可以通过特殊的中断屏蔽挂起非关键中断。这称为中断屏蔽。我不知道什么时候/为什么你可能想要或需要暂时暂停中断?可能是信号量,还是在多处理器环境中编程?

4 个答案:

答案 0 :(得分:35)

操作系统在准备运行自己的“让我们编排世界”代码时就会这样做。

例如,OS线程调度程序在某些时候具有控制权。它准备处理器寄存器以及在线程运行之前需要完成的所有其他操作,以便设置该进程和线程的环境。然后,在让该线程运行之前,它会设置一个定时器中断,在它打算让线程在CPU上流过的时间之后被引发。

在该时间段(量子)过去之后,中断被提升并且OS调度器再次控制。它必须弄清楚接下来需要做什么。为此,它需要保存CPU寄存器的状态,以便它知道如何撤消它执行的代码的副作用。如果在保存状态的同时由于任何原因(例如某些异步I / O完成)引发了另一个中断,这将使操作系统处于其世界处于有效状态的情况下(实际上) ,保存状态需要是原子操作。)

为了避免陷入这种情况,OS内核因此在执行任何需要原子的操作时禁用中断。在完成任何需要的操作并且系统再次处于已知状态后,它会重新启用中断。

答案 1 :(得分:15)

我曾经在ARM板上编程,该板上可能发生大约10次中断。我写的每个特定程序从不对4个以上的程序感兴趣。例如,电路板上有2个定时器,但我的程序只使用1.我会掩盖第二个定时器的中断。如果我没有屏蔽该计时器,它可能已被启用并继续进行中断,这将减慢我的代码。

另一个例子是我会使用UART接收REGISTER完全中断,因此永远不需要UART接收BUFFER完全中断。

我希望这可以帮助您了解为什么要禁用中断。

答案 2 :(得分:14)

除了已经给出的答案之外,还有一个优先考虑因素。您需要或希望能够尽快响应某些中断以及您想要了解的其他中断,但仅限于您不那么忙。最明显的例子可能是重写DVD刻录机上的写缓冲区(如果你不及时这样做,某些硬件只会错误地写DVD),而不是从网络处理新的数据包。在接收到前者的中断后,您将为后者禁用中断,并在填充缓冲区期间将其禁用。

在实践中,相当多的CPU都具有直接内置于硬件中的中断优先级。当发生中断时,禁用的标志被设置为较小的中断,并且通常在读取中断向量并跳转到相关地址的同时进行中断。指示中断的接收也隐式地屏蔽该中断,直到中断处理程序结束具有放松对硬件中断的限制的良好副作用。例如。你可以简单地说信号为高电平会触发中断,并让外部硬件决定将线路保持多长时间,而不必担心会无意中触发多个中断。

在许多陈旧的系统(包括z80和6502)中,往往只有两级中断 - 可屏蔽和不可屏蔽,我认为这是启用或禁用中断的语言来源。但即使早在最初的68000,你就有8级中断和CPU中的当前优先级,它决定了实际允许哪些级别的输入中断生效。

答案 3 :(得分:1)

想象一下你的CPU现在处于“int3”处理程序中,那时“int2”发生了,新发生的“int2”的优先级低于“int3”。我们将如何处理这种情况?

一种方法是在处理“int3”时,我们正在屏蔽其他优先级较低的中断器。也就是说,我们看到“int2”向CPU发出信号,但CPU不会被它打断。在我们完成处理“int3”之后,我们从“int3”返回并取消屏蔽优先级较低的中断器。

我们回到的地方可以是:

  1. 另一个过程(在先发制人系统中)
  2. 被“int3”中断的进程(在非抢占式系统或抢先式系统中)
  3. 由“int3”中断的int处理程序,比如int1的处理程序。
  4. 在情况1和2中,因为我们取消屏蔽了较低优先级的中断器,并且“int2”仍在向CPU发出信号:“嗨,有一些东西让你立即处理”,然后CPU会再次中断,当它正在执行来自进程的指令,以处理“int2”

    在情况3中,如果“int2”的优先级高于“int1”,那么当CPU执行“int1”处理程序的指令时,CPU将再次被中断,以处理“int2”。

    否则,“int1”的处理程序在没有中断的情况下执行(因为我们还屏蔽了优先级低于“int1”的中断程序)并且CPU在处理“int1”并取消屏蔽后将返回到进程。那时“int2”将被处理。