|
本帖最后由 jetcan 于 2024-12-20 15:52 编辑
李老师,您好!
4.9 快速系统调用的进入和返回
为 syscall/sysret 手工切换栈时,必须防止:在栈切换期间产生中断而导致数据被压入旧栈,为此,必须清中断 cli。
现在假设,没有清中断:
syscall 已从用户态进入内核态,没来得及切换栈,当前使用的仍是用户程序 3 特权级的栈,状态为: SS3:RSP3 (x, y, z);
中断发生了,因 syscall_procedure CPL=0,中断处理例程代码段 DPL=0,所以中断不切换栈,仍然使用 SS3:RSP3 (x, y, z);
中断过程在 IA-32e 模式下,无条件压入旧栈,这时中断使用的栈状态为:SS3:RSP3 (x, y, z, SS3:RSP3, RFLAGS, CS:RIP)
当中断例程返回到 syscall_procedure,栈被切换回原来状态:SS3:RSP3(x, y, z)。
这时,再手动为 syscall 切换栈;感觉中断对手工切换栈没影响啊?
不知道我哪里理解的不对?
请老师解惑,谢谢!
|
|