【问题标题】:What happens in the x86 architecture when an interrupt occurs?当中断发生时,x86 架构中会发生什么?
【发布时间】:2011-02-23 06:46:51
【问题描述】:

我正在学习 x86 和实时系统,我有一个问题,那就是:

x86 遵循哪些步骤来处理任何中断?

【问题讨论】:

标签: assembly interrupt x86-16 interrupt-handling


【解决方案1】:

当中断发生时,CPU会做以下事情:

  • 将当前地址(指令指针的内容)压入堆栈;另外,推送处理器标志(但不是所有其他处理器寄存器)
  • 跳转到 ISR(中断服务程序)的地址,该地址在中断描述符表中指定。

ISR 应执行以下操作:

  • 推送它打算更改的任何寄存器(或推送所有寄存器)
  • 处理中断
  • 重新启用中断
  • 弹出它推送的所有寄存器
  • 使用 IRET 指令,从堆栈中弹出 CPU 标志和指令指针值(从而返回到中断发生时正在执行的任何内容)。

【讨论】:

  • 它是发生在用户空间程序的堆栈上还是在某些内部内核堆栈上?
  • 这是对实模式(非保护模式)行为的描述。它发生在当前(应用程序)堆栈上。可以对“中断处理程序”进行编码,以临时切换堆栈寄存器以指向其他一些内存块——但可能不需要或没有实现,因为 ISR 可能只需要几十个字节的应用程序堆栈空间。
【解决方案2】:

Interrupt Descriptor Table 开始。基本上,当发生中断时,流控制会跳转到该表,然后跳转到该表中的任何内容。另外,我相信一旦中断发生,所有寄存器都会被推送,但我不能 100% 确定这一点,因为我已经处理了很长时间了。

【讨论】:

  • 所有寄存器和标志位在中断发生前被压入,在中断处理代码结束后被弹出。
  • 是的,有点像我想的那样。在我做过的一些事情上,你必须自己做推动和弹出。很确定 x86 会为您做到这一点。
  • 处理器标志会自动推送,但其他寄存器不会;当它被调度时,ISR 应该明确地保留它打算改变的任何/所有寄存器。
  • @ChrisW 感谢您提及这一点。 10 年后,我想知道我是否也必须手动 PUSHFPOPF。您的评论是我设法找到的第一个相关答案!
  • @natiiix 你不需要 PUSHF,标志已经被推送了。在 ISR 的末尾有一个 IRET 操作码可以使用,它隐式地弹出标志(所以你也不做显式的 POPF)。
猜你喜欢
  • 2012-02-12
  • 2014-04-21
  • 2011-09-03
  • 2015-04-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多