【发布时间】:2022-01-11 06:40:00
【问题描述】:
当我阅读 Intel 的 X86 程序员手册时,请参阅以下关于堆栈切换的中断和中断返回:
中断:
如果确实发生了堆栈切换,处理器会执行以下操作:
- 临时保存(内部)SS、ESP、EFLAGS、CS 和 EIP 寄存器的当前内容。
- 将新堆栈的段选择器和堆栈指针(即被调用的特权级别的堆栈)从 TSS 加载到 SS 和 ESP 寄存器并切换到新堆栈。
- 将被中断过程堆栈的临时保存的 SS、ESP、EFLAGS、CS 和 EIP 值推送到新堆栈中。
- 在新堆栈上推送错误代码(如果适用)。
- 将新代码段的段选择器和新指令指针(来自中断门或陷阱门)分别加载到 CS 和 EIP 寄存器中。
- 如果调用是通过中断门,清除 EFLAGS 寄存器中的 IF 标志。
- 以新的权限级别开始执行处理程序。
返回时:
- 执行权限检查。
- 将 CS 和 EIP 寄存器恢复为中断或异常之前的值。
- 恢复 EFLAGS 寄存器。
- 将 SS 和 ESP 寄存器恢复为其在中断或异常之前的值,从而导致堆栈切换回中断过程的堆栈。
- 恢复执行中断的过程。
比如一个linux进程P:
- 最初处于内核模式
- 通过
iret返回用户模式。但是从手册上看,TSS 没有变化 - 它通过
int陷入内核。这里需要从 TSS 中的ESP & SS找到内核栈。这个内核堆栈值是如何设置的,因为它们没有在步骤 2 中存储到 TSS?
【问题讨论】:
标签: linux-kernel x86 operating-system kernel interrupt