中断导致CPU将EFLAGS,CS和IP寄存器保存到“堆栈”中,而iret指令将它们弹出。这个堆栈在哪里? CPU如何知道它(我假设某处注册)?我想要肮脏的细节。我正在研究基于Unix的系统。说Linux。
答案 0 :(得分:3)
首先,查看所有细节的英特尔手册: http://www.intel.com/content/www/us/en/processors/architectures-software-developer-manuals.html
关于你的问题:
堆栈在哪里?
在中断时,x86内核从任务状态段(TSS)加载堆栈指针。 IDT指定通过任务选择器字段使用哪个TSS。在32位模式下,TSS提供4个堆栈指针,每个保护级别一个。由于保护级别通常仅为0或3,因此只有两个堆栈是相关的。在64位模式下,中断描述符条目可以选择指定在给定的64位TSS中使用哪个堆栈指针的索引0-7。然而,由于重入问题,这种64位堆栈选择机制大部分都被打破,而OS则采用软件切换。查看x86 Programmer Reference Volume 3,图7-2。
如果中断将内核移动到更高的权限级别(数字上更低的CPL),则内核将中断堆栈帧推送到此新堆栈,而不是中断进程的当前堆栈。如果权限级别保持不变,则核心只是将中断堆栈帧推送到当前堆栈上。
CPU如何了解它?
中断描述符表(IDT)为每个中断向量0-255提供描述符。描述符条目告诉核心使用哪个TSS(即堆栈),用户模式是否可以通过向量调用,是否在ISR条目上禁用中断等。参见PRM第3卷,第6章。因此,所有中断处理都是真的以IDT中的信息为基础。
答案 1 :(得分:2)
中断不会导致操作系统保存EFLAGS,CS和IP。 CPU在没有操作系统的情况下自行完成。
第一个堆栈由重置后在CPU上执行的第一个代码设置。通常,首先是ROM BIOS代码。它设置SS和SP寄存器以指示堆栈位置。然后堆栈可以并且通常由引导加载程序更改/移动,然后内核可以再次移动它。
只要前面的代码片段想要找到堆栈,只要有足够大小的可读写内存,它们就可以。
答案 2 :(得分:1)
SS:(E)SP - SS(堆栈段) SS是CPU内部的16位寄存器,(E)SP为16(实模式),32位,64位大小,处于保护模式。