在开始系统调用时,如何保存用户模式ss和esp,例如在linux中?

时间:2011-01-17 02:39:31

标签: x86 linux-kernel system-calls

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

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

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

1 个答案:

答案 0 :(得分:0)

考虑指令指针会发生什么。显然,某处必须有一些硬件支持。

暂且不谈现代的“快速系统调用”技术(稍后我将回到此处),请注意,只需发出特定的软件中断并且某些处理器寄存器设置正确,即可请求系统调用。那么接下来发生的事情就是处理器中的中断硬件。

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

现在,如果我们看一下“快速系统调用”(SYSENTER指令),我们注意到它需要设置一些机器状态寄存器,并且它不保存状态(这是什么使它比发出中断更快的一部分)。调用代码负责在未编号寄存器中放置内核为执行系统调用所需的数据,以及返回其原始状态所需的数据。

相关问题