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

Operating system 从内核模式返回到用户模式,operating-system,system-calls,context-switch,kernel-mode,Operating System,System Calls,Context Switch,Kernel Mode,我对Unix内核中的模式切换的理解有点困惑。我在此给出我的理解,并将其打开以供讨论/更正 当从用户模式转换到内核模式时,处理器在每进程用户堆栈和每进程内核堆栈之间进行切换。然后,每个进程的用户堆栈段选择器和堆栈指针存储在内核堆栈中,然后将eip指令指针(用户模式下的返回地址)和其他硬件寄存器推送到内核堆栈中 当内核必须返回到用户模式时,trapret代码将存储在内核堆栈中的所有值弹出回硬件寄存器 但是当iret从内核堆栈中弹出eip时,应该执行的下一条指令是用户模式下的返回地址 这在不完全弹出

我对Unix内核中的模式切换的理解有点困惑。我在此给出我的理解,并将其打开以供讨论/更正

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

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

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

这在不完全弹出内核堆栈的其他值的情况下发生

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

内核堆栈中的用户堆栈指针是如何弹出回%esp的

iret
还原所有这些内容
iret
指令相当复杂。引用


当从中断或异常处理程序返回时,处理器将执行以下操作:

  • 执行权限检查
  • 将CS和EIP寄存器恢复到中断前的值或 例外
  • 恢复EFLAGS寄存器
  • 将SS和ESP寄存器恢复到中断前的值或 异常,导致堆栈切换回中断的堆栈 程序
  • 继续执行中断的过程

  • 也在这里发布了另一个疑问。。。你能帮我回答这个问题吗?