3

我对 Unix 内核中的模式切换的理解有点困惑。我在这里给出我的理解并将其打开以供讨论/更正。

在从用户模式转换到内核模式时,处理器会在每进程用户堆栈和每进程内核堆栈之间进行切换。然后每个进程的用户堆栈段选择器和堆栈指针存储在内核堆栈中,然后eip指令指针(用户模式下的返回地址)和其他硬件寄存器被压入内核堆栈

当内核必须返回用户模式时,trapret代码会将存储在内核堆栈中的所有值弹出回硬件寄存器。

trapret 从内核堆栈中弹出值

但是当iret从内核堆栈中弹出 eip 时,应该执行的下一条指令是用户模式下的返回地址。

这发生在没有完全弹出内核堆栈的其他值的情况下。

其余的值 ( %cs, %eflags, %esp, %ss) 如何恢复?

内核堆栈中存在的用户堆栈指针如何弹回 %esp ?

从用户模式转换到内核模式期间的陷阱帧

4

1 回答 1

2

iret恢复所有的东西

iret指令相当复杂。引用英特尔架构手册:


当从与中断过程不同的特权级别执行中断或异常处理程序的返回时,处理器执行以下操作:

  1. 执行权限检查。
  2. 将 CS 和 EIP 寄存器恢复到中断或异常之前的值。
  3. 恢复 EFLAGS 寄存器。
  4. 将 SS 和 ESP 寄存器恢复到中断或异常之前的值,导致堆栈切换回中断过程的堆栈。
  5. 恢复执行被中断的过程。
于 2012-04-01T20:38:02.103 回答