【问题标题】:What happens if another interrupt is raised before the first interrupt action is completed?如果在第一个中断操作完成之前引发另一个中断会发生什么?
【发布时间】:2009-05-31 01:49:45
【问题描述】:

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

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

【问题讨论】:

    标签: interrupt-handling


    【解决方案1】:

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

    有一个名为IF(中断标志)的处理器标志,它控制硬件中断是否可以被处理,或者必须被搁置。当 IF = 0 时,中断将被推迟,直到重新启用标志(NMI 除外,即不可屏蔽中断,它旨在作为无法阻止的“仅紧​​急”中断)。

    在调用中断服务例程之前,处理器会自动清除IF。这对于防止中断调用变得失控是必要的。请注意,中断服务代码本身不能这样做,因为如果在进入例程之前没有禁用IF,那么在服务代码有时间执行甚至一条指令之前,可能会发生更多中断。然后,中断的“消防水带”将立即导致(所有事情中的)堆栈溢出。

    因此,回答您的直接问题:通常,当第二个硬件中断发生在第一个硬件中断正在被服务时,该中断将被搁置,直到第一个中断完成。

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

    【讨论】:

      【解决方案2】:

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

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

      一个中断处理程序可能会阻塞其他中断。

      【讨论】:

        【解决方案3】:

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

        所以,如果你的中断服务程序正在做它的事情,然后另一个中断发生了,就好像你在做其他事情一样:相应的中断程序将被调用。

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

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2014-07-30
          • 1970-01-01
          • 2014-04-04
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2016-12-13
          相关资源
          最近更新 更多