我对 Unix 内核中的模式切换的理解有点困惑。我在这里给出我的理解并将其打开以供讨论/更正。
在从用户模式转换到内核模式时,处理器会在每进程用户堆栈和每进程内核堆栈之间进行切换。然后每个进程的用户堆栈段选择器和堆栈指针存储在内核堆栈中,然后eip
指令指针(用户模式下的返回地址)和其他硬件寄存器被压入内核堆栈
当内核必须返回用户模式时,trapret
代码会将存储在内核堆栈中的所有值弹出回硬件寄存器。
但是当iret
从内核堆栈中弹出 eip 时,应该执行的下一条指令是用户模式下的返回地址。
这发生在没有完全弹出内核堆栈的其他值的情况下。
其余的值 ( %cs, %eflags, %esp, %ss
) 如何恢复?
内核堆栈中存在的用户堆栈指针如何弹回 %esp ?