2010-05-24 40 views

回答

2

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

+1

在中断发生之前,所有的寄存器和标志都被压入中断处理代码结束后弹出。 – nc3b 2010-05-24 15:05:55

+0

是的,还挺我的想法。在我所做的一些事情上,你必须做自己的推动和弹出。很确定x86是为你做的。 – 2010-05-24 15:09:46

+5

处理器标志被自动推送,但其他寄存器不是;当它被派遣时,ISR应明确地保存它打算改变的任何/所有寄存器。 – ChrisW 2010-05-24 15:16:59

8

当一个中断发生时,CPU将执行以下操作:

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

的ISR应该做到以下几点:

  • 推它打算改变(或,推动所有寄存器)
  • 处理中断
  • 重新启用中断
  • 弹出任何任何寄存器它推动的寄存器
  • 使用IRET指令,它从堆栈中弹出CPU标志和指令指针值(并因此返回到whateve当中断发生时r正在执行)。
+1

它发生在用户空间程序的堆栈上还是发生在某些内部内核堆栈上? – 2016-09-19 05:53:28