【问题标题】:What are the Registers pushed to the stack when an Interrupt Occurs中断发生时压入堆栈的寄存器是什么
【发布时间】:2016-07-10 14:33:00
【问题描述】:

发生中断时CPU自动保存哪些状态?以及按哪个顺序?

【问题讨论】:

  • 为什么顺序很重要?要查看 Linux 内核的功能,请查看处理此问题的实际代码:github.com/torvalds/linux/blob/master/arch/x86/entry/entry_64.S
  • 什么CPU?什么模式(真实/受保护/长期)?什么样的中断?通常,您只需阅读 CPU 架构的描述并使用它必须生成软件中断、处理 sw/hw 中断和从中断返回的命令。文档还将定义硬件保存的内容,如果您想使用更多寄存器,则必须在使用前保存它们并在退出 ISR 之前恢复。
  • @osgx:这是标记为 x86,所以我们至少知道什么架构。我不敢相信这不是 stackoverflow.com/questions/26024371/…stackoverflow.com/questions/6332517/… 之类的复制品。虽然也许其中一个应该被标记为这个的副本,或者不是因为第二个甚至不是 x86 特定的。
  • Peter,你知道(x86 标签上有黄色徽章)x86 不是 CPU 也不是架构,它是 en.wikipedia.org/wiki/X86 "一个family 向后兼容的指令集架构”。而且这个家庭不适合开始学习计算机体系结构。
  • 是的,我正在寻找 x86 架构

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


【解决方案1】:

发生中断时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 标志,以了解如何启动和从中断返回。关于硬件中断(您质疑哪种中断) - 检查堆栈是否有 10-20 个字节;加载 SS,eSP,CS:EIP/CS:IP; push“指向旧堆栈的长指针”,push eflags,push“返回位置的长指针”

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

【讨论】:

  • 谢谢伙计。有 x86 架构的文档吗?
  • 英特尔有 x86 的“文档”,“英特尔® 64 和 IA-32 架构软件开发人员手册”intel.com/content/www/us/en/processors/… - 但它太复杂了(它描述了英特尔的 x86 的许多版本)。你可以从更简单的东西开始,比如 MIPS (DLX) 甚至 RISC-V,或者从最早的英特尔开始,比如 386 (400 pages,1986)、586、Pentium。或非官方的,例如“Unabridged Pentium 4, The: IA32 Processor Genealogy”一书(2004 年)。 + stackoverflow.com/tags/x86/info
  • 我看到一行写着“所有寄存器,除了由‘IRET’指令恢复的 EFLAGS 寄存器,都由编译器保留。”在gitlab.indel.ch/thirdparty/gcc/commit/… 和我的一门大学课程中,我有一个问题问为什么 all 寄存器在中断时保存在堆栈中。 (海合会公约)。但是我无法在网上找到很多文档;那么某些实例是否保存所有寄存器,而某些实例仅保存您提到的那些? @osgx
猜你喜欢
  • 2012-04-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-04-19
  • 2018-04-17
相关资源
最近更新 更多