这个问题来自中断处理主题。
假设正在处理一个中断。如果在第一个中断操作完成之前引发另一个中断会发生什么?
以下内容仅适用于 x86 架构,但其他架构可能会遵循相同的模式:
有一个称为IF
(中断标志)的处理器标志,它控制硬件中断是否可以被处理,或者必须被搁置。当 IF = 0 时,中断将被推迟,直到重新启用标志(NMI 除外,即不可屏蔽中断,它旨在作为无法阻止的“仅紧急”中断)。
在IF
调用中断服务程序之前,处理器会自动清除它。这对于防止中断调用变得失控是必要的。请注意,中断服务代码本身无法自行执行此操作,因为如果IF
在进入例程之前未禁用,则可能在服务代码有时间执行甚至一条指令之前发生更多中断。然后,中断的“消防水带”将立即导致(在所有事情中)堆栈溢出。
因此,回答您的直接问题:通常,当第二个硬件中断发生在第一个硬件中断正在服务时,该中断将被搁置,直到第一个中断完成。
像往常一样,整个故事有点复杂。英特尔网站上的英特尔架构软件开发人员手册从第 10-4 页开始提供了更完整的描述。
这取决于系统。通常,如果新中断的优先级高于第一个中断,则会对其进行响应,挂起第一个中断的处理程序。当其处理程序完成时,原始中断处理程序将恢复。最后,假设不再有中断,原始处理程序完成并恢复正常服务。有时,恢复的进程会是被中断的进程;有时,它将不再是最符合条件的流程,而其他流程将恢复。
类似地,如果原始中断的第二个或后续实例在第一个处理程序完成之前发生,或者如果发生较低或同等优先级的中断,它将一直保持到第一个处理程序完成。在恢复正常处理之前,内核会检查本应处理但被阻止的未完成中断。
中断处理程序可能会阻止其他中断。
好吧,如果在第一个中断之后没有禁用中断,那么第二个将导致您的中断服务程序再次被调用。您必须确保中断被禁用以避免这种明显不受欢迎的行为。
所以,如果你的中断服务程序正在做它的事情,然后另一个中断发生了,就好像你在做其他事情一样:相应的中断程序将被调用。
在 Intel 架构上,“cli”指令将禁用中断,而“sti”将再次启用它们。