堆栈为iret和int指令

时间:2012-10-22 17:13:32

标签: operating-system x86 kernel interrupt

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

3 个答案:

答案 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位大小,处于保护模式。

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