当中断发生时,哪些寄存器被压入堆栈

时间:2016-07-10 14:33:01

标签: linux-kernel x86 kernel interrupt cpu-registers

发生中断时CPU自动保存的状态是什么?以什么顺序?

1 个答案:

答案 0 :(得分:4)

  

发生中断时CPU自动保存的状态是什么?

保存了一些寄存器;该集由CPU架构定义。它可以保存到堆栈,内存中的固定地址或影子寄存器中。通常这组寄存器很小,如果ISR需要更多,它可以通过实际代码保存它们,而不是CPU自动硬件。 (在“中断进入/退出”中检查Cody Gray的链接。)

  

以何种顺序?

寄存器保存的顺序,当它们被推送到堆栈时由架构定义。

对于默认体系结构,x86 / x86_64的定义就像(前一个问题中我的答案https://stackoverflow.com/a/38031260/196561中已经列出的第一个链接,带有“* FLAGS,CS,IP”顺序):

https://en.wikibooks.org/wiki/X86_Assembly/Advanced_Interrupts& iret文档http://www.felixcloutier.com/x86/IRET:IRETD.html

  • 在实模式下,在中断硬件上推送FLAGS,推送CS,推送IP; iret指令将重新加载它们以返回给用户。
  • 在保护模式下检查EFLAGS中的VM和NT标志,以查找如何从中断启动和返回。关于hw中断(你质疑什么样的中断) - 检查堆栈是否有10-20个字节;负载SS,eSP,CS:EIP / CS:IP;按“长指针指向旧堆栈”,按下eflags,按“长指针返回位置”

实际逻辑更复杂。 386中有逻辑进入中断http://intel80386.com/386htm/INT.htm和iret http://intel80386.com/386htm/IRET.htm(“操作”)。