Operating system iret和int指令的堆栈
中断导致CPU将EFLAGS、CS和IP寄存器保存到“堆栈”上,iret指令将其弹出。这个堆栈在哪里?CPU是如何知道它的(我假设某个地方有一些寄存器)?我想要肮脏的细节。我正在研究基于Unix的系统。比如说Linux 中断不会导致操作系统保存EFLAGS、CS和IP。CPU自己做这件事,没有操作系统 第一个堆栈由复位后CPU上执行的第一个代码设置。通常,首先要做的是ROM BIOS代码。它设置SS和SP寄存器以指示堆栈位置。然后,引导加载程序可以(通常是)更改/移动堆栈,然后内核可以再次移动堆栈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寄存器以指示堆栈位置。然后,引导加载程序可以(通常是)更改/移动堆栈,然后内核可以再次移动堆
只要有足够大小的可读写内存,上述代码段就可以定位堆栈。中断不会导致操作系统保存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位大小(保护模式)
是的,我搞砸了。我改变了问题来反映这一点。是的,我搞砸了。我改变了问题以反映这一点。