我对Unix内核中的模式切换理解有点混淆。我在这里阐述我的理解,并开放讨论/纠正。
在从用户模式切换到内核模式时,处理器会在进程级用户栈和进程级内核栈之间进行切换。然后,将用户进程堆栈段选择器和堆栈指针存储在内核栈中,接着将eip
指令指针(在用户模式下的返回地址)和其他硬件寄存器推送到内核栈上。
当内核需要返回到用户模式时,trapret
代码将所有存储在内核栈中的值弹出到硬件寄存器中。
但是当iret
从内核栈中弹出eip时,下一个应该执行的指令是在用户模式下的返回地址。
这样做的过程并不完全将内核栈的其余值弹出。
其余的值(%cs,%eflags,%esp,%ss
)如何被恢复?
内核栈中的用户栈指针是如何被弹回到%esp?