从内核模式返回用户模式

3

我对Unix内核中的模式切换理解有点混淆。我在这里阐述我的理解,并开放讨论/纠正。

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

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

trapret popping the values off the kernel stack

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

这样做的过程并不完全将内核栈的其余值弹出。

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

内核栈中的用户栈指针是如何被弹回到%esp?

Trap Frame during a transition from user mode to kernel mode

1个回答

3

iret指令恢复所有相关内容

iret指令相当复杂。引用Intel体系结构手册的话:


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

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

还在这里发布了另一个疑问...http://stackoverflow.com/questions/9969922/how-does-a-stack-switch-take-place 你能回答我吗? - Sharat Chandra
第五篇文章-恢复中断的进程的执行是否意味着恢复程序计数器? - Smart Humanism

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接