我对Unix内核中模式切换的理解有点困惑。我在这里给出了理解并打开它进行讨论/纠正。
在从用户模式转换到内核模式时,处理器在每进程用户堆栈和每进程内核堆栈之间进行切换。然后,每进程用户堆栈段选择器和堆栈指针存储在内核堆栈中,然后将eip
指令指针(用户模式下的返回地址)和其他硬件寄存器推送到内核堆栈
当内核必须返回用户模式时,trapret
代码会将存储在内核堆栈中的所有值弹回硬件寄存器。
但是当iret
从内核堆栈弹出时,应该执行的下一条指令是用户模式下的返回地址。
发生这种情况时,不会完全弹出内核堆栈的其他值。
其余值(%cs, %eflags, %esp, %ss
)如何恢复?
内核堆栈中存在的用户堆栈指针如何弹回到%esp?
答案 0 :(得分:2)
iret
恢复所有内容 iret
指令非常复杂。引用the Intel architecture manual:
当执行来自中断或异常处理程序的返回来自与中断过程不同的权限级别时,处理器执行以下操作: