转自:点击打开链接
操作系统必须至少建立一个TSS,4个权限级别的堆栈结构(stack segment selector及stack pointer)必须被定义。
一、 堆栈及栈指针的权限级别:
★ 3 级:stack selector及stack pointer存储在SS寄存器及 ESP 寄存器中
★ 0、1及2级:相应的stack selector及stack pointer存储在TSS相应的域中。
二、当发生向高权限级别代码转移时,发生堆栈的切换:
★ 根据CPL(转移时CPL改变)在TSS得到相应级别的堆栈结构(SS及ESP)
★ 进行栈结构检查,包括limit检查、stack segment descriptor一系列的检查后,stack selector 及 stack pointer加载到 SS及 ESP寄存器。
★ 将原来级别的(权限低)stack selector及stack pointer压入新的堆栈中(权限高),这个过程是:加载新的SS及ESP时,先临时保存旧的SS及ESP,再将临时保存旧的SS及ESP压入新的堆栈中。
★ 若有参数,则压入参数(参数个数定义在call gate中的param count域)
★ 压入返回地址(CS及EIP)
★ 若有错误码,则压入错误码。
注意事项:
★ call gate 允许最多31个参数,在调用者的堆栈里。发生切换时,将从调用者的堆栈里复制到新的堆栈里。
切换后堆栈结构图:
calling procedure called procedure
| … … |
| param1 |
| Param2 |
| Param3 |
| … … |
|
… … |
| calling SS |
| calling ESP |
| param1 |
| param2 |
| param3 |
| calling CS |
| calling EIP |
| ... ... |
| … …
|
本文详细介绍了在不同权限级别间进行代码转移时的操作系统如何管理堆栈结构,包括堆栈切换的过程、参数传递方式以及堆栈结构的检查机制。
2535

被折叠的 条评论
为什么被折叠?



