关于 x86:启动系统调用时,如何保存用户模式的 ss 和 esp,例如在Linux?

When starting a system call, how are user-mode ss and esp saved, e.g. in linux?

我知道用户模式 ??ss/esp 应该保存到内核模式堆栈中以供以后恢复。

问题是要定位内核模式堆栈,ss/esp 必须首先加载相应的内核模式值。现在在我看来,用户模式 ??ss/esp 已被刷新。那么硬件/系统如何检索用户模式 ??ss/esp?

用户模式的 ss 和 esp 是否保存在一些临时位置?还是x86电路支持该操作?


想想指令指针会发生什么。显然那里一定有一些硬件支持。

撇开现代"快速系统调用"技术(我稍后会回到这个),请注意,系统调用是通过发出特定的软件中断来请求的,并且某些处理器寄存器设置得当。所以接下来会发生什么取决于处理器中的中断硬件。

当中断发生时,处理器会自动将各种寄存器和其他信息(例如指令指针,以及甚至在处理程序有机会保存它们之前可以修改的其他内容)推送到内核堆栈。此外,如果处理器当前未处于内核模式,它将堆栈指针和堆栈段寄存器压入内核堆栈并转换到内核模式,执行中断处理程序。

现在,如果我们查看"快速系统调用"(SYSENTER 指令),我们注意到它需要已经设置了一些机器状态寄存器,并且它不保存状态(这是使其比发出中断更快)。调用代码负责将内核执行系统调用所需的数据以及返回其原始状态所需的数据放入未破坏的寄存器中。