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