如果在第一个中断操作完成之前引发另一个中断,会发生什么?

时间:2009-05-31 01:49:46

标签: interrupt-handling

这个问题来自中断处理主题。

假设正在处理中断。如果在第一个中断动作完成之前引发另一个中断会发生什么?

3 个答案:

答案 0 :(得分:4)

以下内容仅适用于x86体系结构,但其他体系结构可能遵循相同的模式:

有一个名为IF(中断标志)的处理器标志,用于控制是否可以处理硬件中断,或者必须将其置于保持状态。当IF = 0时,中断将被推迟,直到重新启用该标志(NMI,不可屏蔽中断除外,这是一个无法阻止的'仅限紧急'中断)。

在调用中断服务程序之前,处理器会自动清除IF。这是防止中断调用失控的必要条件。请注意,中断服务代码本身不能单独执行此操作,因为如果在进入例程之前未禁用IF,则在服务代码有时间执行甚至单个之前可能会发生更多中断指令。然后,中断的“消防”会立即导致(所有事情)堆栈溢出。

因此,在回答您的直接问题时:通常,当初始服务器发生第二次硬件中断时,该中断将被保持,直到第一次中断完成为止。

像往常一样,完整的故事有点复杂。英特尔网站上的Intel Architecture Software Developer’s Manual从第10-4页开始提供更完整的说明。

答案 1 :(得分:2)

这取决于系统。通常,如果新中断的优先级高于第一个,则响应,暂停第一个中断的处理程序。当其处理程序完成时,原始中断处理程序将恢复。最后,假设没有更多中断,原始处理程序完成并恢复正常服务。有时,恢复的过程将是被中断的过程;有时,它将不再是最符合条件的流程,而其他一些流程将会恢复。

类似地,如果原始中断的第二个或后续实例在第一个处理程序完成之前发生,或者如果发生较低或相等的优先级中断,则它将一直保持到第一个处理程序完成为止。在恢复正常处理之前,内核会检查应该处理但被阻止的未完成中断。

中断处理程序可能会阻止其他中断。

答案 2 :(得分:0)

好吧,如果第一次中断后没有禁用中断,第二次中断将导致中断服务程序再次被调用。您必须确保禁用中断以避免这种明显不良行为。

因此,如果您的中断服务程序正在执行其操作,然后发生另一个中断,则就像您正在执行其他操作一样:将调用相应的中断例程。

在英特尔架构上,“cli”指令将禁用中断,“sti”将再次启用它们。