Operating system iret和int指令的堆栈

Operating system iret和int指令的堆栈,operating-system,x86,kernel,interrupt,Operating System,X86,Kernel,Interrupt,中断导致CPU将EFLAGS、CS和IP寄存器保存到“堆栈”上,iret指令将其弹出。这个堆栈在哪里?CPU是如何知道它的(我假设某个地方有一些寄存器)?我想要肮脏的细节。我正在研究基于Unix的系统。比如说Linux 中断不会导致操作系统保存EFLAGS、CS和IP。CPU自己做这件事,没有操作系统 第一个堆栈由复位后CPU上执行的第一个代码设置。通常,首先要做的是ROM BIOS代码。它设置SS和SP寄存器以指示堆栈位置。然后,引导加载程序可以(通常是)更改/移动堆栈,然后内核可以再次移动堆

中断导致CPU将EFLAGS、CS和IP寄存器保存到“堆栈”上,iret指令将其弹出。这个堆栈在哪里?CPU是如何知道它的(我假设某个地方有一些寄存器)?我想要肮脏的细节。我正在研究基于Unix的系统。比如说Linux

中断不会导致操作系统保存EFLAGS、CS和IP。CPU自己做这件事,没有操作系统

第一个堆栈由复位后CPU上执行的第一个代码设置。通常,首先要做的是ROM BIOS代码。它设置SS和SP寄存器以指示堆栈位置。然后,引导加载程序可以(通常是)更改/移动堆栈,然后内核可以再次移动堆栈


只要有足够大小的可读写内存,上述代码段就可以定位堆栈。

中断不会导致操作系统保存EFLAGS、CS和IP。CPU自己做这件事,没有操作系统

第一个堆栈由复位后CPU上执行的第一个代码设置。通常,首先要做的是ROM BIOS代码。它设置SS和SP寄存器以指示堆栈位置。然后,引导加载程序可以(通常是)更改/移动堆栈,然后内核可以再次移动堆栈


只要有足够大小的可读写内存,上述代码段就可以定位堆栈。

首先,查看英特尔手册了解所有细节:

关于你的问题:

堆栈位于哪里

在中断时,x86内核从任务状态段(TSS)加载堆栈指针。IDT通过任务选择器字段指定要使用的TSS。在32位模式下,TSS提供4个堆栈指针,每个保护级别一个。由于保护级别通常仅为0或3,因此只有两个堆栈相关。在64位模式下,中断描述符项可以选择指定索引0-7,在给定的64位TSS中使用该索引的堆栈指针。然而,由于可重入性问题,这种64位堆栈选择机制大部分被破坏,操作系统求助于软件切换。查看x86程序员参考卷3,图7-2

如果中断将内核移动到更高的特权级别(CPL数值更低),那么内核会将中断堆栈帧推到这个新堆栈上,而不是被中断进程的当前堆栈上。如果特权级别保持不变,那么内核只是将中断堆栈帧推到当前堆栈上的适当位置

CPU是如何知道的


中断描述符表(IDT)为每个中断向量提供一个描述符,0-255。描述符条目告诉核心使用哪个TSS(即堆栈),用户模式是否可以通过向量调用,中断是否在ISR条目上禁用,等等。参见PRM第3卷第6章。因此,所有中断处理实际上都是由IDT中的信息确定的。

首先,查看英特尔手册了解所有细节:

关于你的问题:

堆栈位于哪里

在中断时,x86内核从任务状态段(TSS)加载堆栈指针。IDT通过任务选择器字段指定要使用的TSS。在32位模式下,TSS提供4个堆栈指针,每个保护级别一个。由于保护级别通常仅为0或3,因此只有两个堆栈相关。在64位模式下,中断描述符项可以选择指定索引0-7,在给定的64位TSS中使用该索引的堆栈指针。然而,由于可重入性问题,这种64位堆栈选择机制大部分被破坏,操作系统求助于软件切换。查看x86程序员参考卷3,图7-2

如果中断将内核移动到更高的特权级别(CPL数值更低),那么内核会将中断堆栈帧推到这个新堆栈上,而不是被中断进程的当前堆栈上。如果特权级别保持不变,那么内核只是将中断堆栈帧推到当前堆栈上的适当位置

CPU是如何知道的

中断描述符表(IDT)为每个中断向量提供一个描述符,0-255。描述符条目告诉核心使用哪个TSS(即堆栈),用户模式是否可以通过向量调用,中断是否在ISR条目上禁用,等等。参见PRM第3卷第6章。因此,所有中断处理实际上都是由IDT中的信息锚定的。

SS:(E)SP-SS(堆栈段) SS是CPU内部可用的16位寄存器,(E)SP是16位(实模式),32位,64位大小(保护模式)

  • 在初始BIOS POST时,有效的SS:(E)SP由BIOS设置
  • BIOS将控制权交给MBR,然后在MBR引导加载程序代码中 可以重置并设置有效的SS:(E)SP值
  • 在保护模式下,我们需要为添加段设置有效的GDT值 CS、DS、SS,然后将适当的值加载到段 CPU的责任,对于这个操作系统应该协调
  • SS:(E)SP-SS(堆栈段) SS是CPU内部可用的16位寄存器,(E)SP是16位(实模式),32位,64位大小(保护模式)

  • 在初始BIOS POST时,有效的SS:(E)SP由BIOS设置
  • BIOS将控制权交给MBR,然后在MBR引导加载程序代码中 可以重置并设置有效的SS:(E)SP值
  • 在保护模式下,我们需要为添加段设置有效的GDT值 CS、DS、SS,然后将适当的值加载到段 CPU的责任,对于这个操作系统应该协调

  • 是的,我搞砸了。我改变了问题来反映这一点。是的,我搞砸了。我改变了问题以反映这一点。