21 operating-system interrupt computer-architecture
我在读中断.可以通过特殊的中断屏蔽挂起非关键中断.这称为中断屏蔽.我不知道什么时候/为什么你可能想要或需要暂时暂停中断?可能是信号量,还是在多处理器环境中编程?
Jon*_*Jon 36
操作系统在准备运行自己的"让我们编排世界"代码时就会这样做.
例如,OS线程调度程序在某些时候具有控制权.它准备处理器寄存器以及在线程运行之前需要完成的所有其他操作,以便设置该进程和线程的环境.然后,在让该线程运行之前,它会设置一个定时器中断,在它打算让线程在CPU上流过之后再引发.
在该时间段(量子)过去之后,中断被提升并且OS调度器再次控制.它必须弄清楚接下来需要做什么.为此,它需要保存CPU寄存器的状态,以便它知道如何撤消它执行的代码的副作用.如果在保存状态的同时因任何原因(例如某些异步I/O完成)引发了另一个中断,这将使操作系统处于其世界未处于有效状态的情况下(实际上,保存状态需要是原子操作).
为了避免陷入这种情况,OS内核因此在执行任何需要原子的操作时禁用中断.在完成任何需要的操作并且系统再次处于已知状态后,它会重新启用中断.
WuH*_*ted 16
我曾经在ARM板上编程,该板上可能发生大约10次中断.我写的每个特定程序从不对4个以上的程序感兴趣.例如,电路板上有2个定时器,但我的程序只使用1.我会掩盖第二个定时器的中断.如果我没有屏蔽该计时器,它可能已被启用并继续进行中断,这将减慢我的代码.
另一个例子是我将使用UART接收REGISTER完全中断,因此永远不需要UART接收BUFFER完全中断.
我希望这可以让您了解为什么要禁用中断.
Tom*_*mmy 16
除了已经给出的答案之外,还有一个优先考虑因素.您需要或希望能够尽快响应某些中断以及您想要了解的其他中断,但仅限于您不那么忙.最明显的例子可能是重写DVD刻录机上的写缓冲区(如果你不及时这样做,某些硬件只会错误地写DVD),而不是从网络处理新的数据包.在接收到前者的中断后,您将禁用后者的中断,并在填充缓冲区期间将其禁用.
实际上,相当多的CPU都具有直接内置于硬件中的中断优先级.当发生中断时,禁用的标志被设置为较小的中断,并且通常在读取中断向量并跳转到相关地址的同时进行中断.指示中断的接收也隐式地屏蔽该中断,直到中断处理程序结束具有放松对硬件中断的限制的良好副作用.例如,您可以简单地说信号为高电平会触发中断,并让外部硬件决定将线路保持多长时间,而不必担心无意中触发多个中断.
在许多过时的系统(包括z80和6502)中,往往只有两级中断 - 可屏蔽和不可屏蔽,我认为这是启用或禁用中断的语言来源.但即使早在最初的68000,你就有了8级中断和CPU中的当前优先级,这决定了实际允许哪些级别的输入中断生效.