从内核模式返回到用户模式

时间:2012-04-01 20:27:57

标签: operating-system system-calls context-switch kernel-mode

我对Unix内核中模式切换的理解有点困惑。我在这里给出了理解并打开它进行讨论/纠正。

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

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

trapret popping the values off the kernel stack

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

发生这种情况时,不会完全弹出内核堆栈的其他值。

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

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

Trap Frame during a transition from user mode to kernel mode

1 个答案:

答案 0 :(得分:2)

iret恢复所有内容

iret指令非常复杂。引用the Intel architecture manual:


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

  1. 执行特权检查。
  2. 在中断或之前将CS和EIP寄存器恢复为其值 异常。
  3. 恢复EFLAGS注册。
  4. 在中断或之前将SS和ESP寄存器恢复为其值 异常,导致堆栈切换回中断的堆栈 过程。
  5. 恢复执行中断的程序。