1.栈切换过程
使用调用门改变了CPL,必须切换栈,即从当前栈切换到与目标代码段特权级相同栈上。栈切换由处理器固件自动完成。栈切换过程如下:
- 从TSS中选取目标代码段DPL的栈,读出段选择子和ESP;
- 使用选择子读取栈描述符,检查特权级,类型等;
- 临时保存旧栈(当前栈)SS,ESP;
- 将(1)中独处的新栈选择子、段指针代入SS和ESP,切换到新栈;
- 将(3)保存的旧栈SS,ESP压入新栈(保存现场);
- 根据调用门描述符"参数个数",从旧栈中读出并压入新栈;
- 压入CS,EIP(保存现场,通过调用门一定是FAR远转移,压CS);
- 从调用门描述符中读出段选择子,段内偏移==>CS:EIP,开始执行被调用过程;
新栈切换完情况:
![](https://i-blog.csdnimg.cn/blog_migrate/ab975e26dd6388ac7e5b292f781c4b5f.jpeg)
2.控制返回过程
返回 | 对比 | |
---|---|---|
同一特权级 | 栈不变,栈中弹出调用者代码段选择子和指令指针 | |
特权级变化的(远)返回 | 只能返回到低特权级 |