堆栈的切换

本文详细介绍了在不同权限级别间进行代码转移时的操作系统如何管理堆栈结构,包括堆栈切换的过程、参数传递方式以及堆栈结构的检查机制。

转自:点击打开链接

操作系统必须至少建立一个TSS4个权限级别的堆栈结构(stack segment selectorstack pointer)必须被定义。

 

一、 堆栈及栈指针的权限级别:

★    3 级:stack selectorstack pointer存储在SS寄存器及 ESP 寄存器中

★    012级:相应的stack selectorstack pointer存储在TSS相应的域中。

 

 

二、当发生向高权限级别代码转移时,发生堆栈的切换:

★    根据CPL(转移时CPL改变)在TSS得到相应级别的堆栈结构(SSESP

★    进行栈结构检查,包括limit检查、stack segment descriptor一系列的检查后,stack selector stack pointer加载到 SS ESP寄存器。

★    将原来级别的(权限低)stack selectorstack pointer压入新的堆栈中(权限高),这个过程是:加载新的SSESP时,先临时保存旧的SSESP,再将临时保存旧的SSESP压入新的堆栈中。

★    若有参数,则压入参数(参数个数定义在call gate中的param count域)

★    压入返回地址(CSEIP

★    若有错误码,则压入错误码。

 

 

注意事项:

★    call gate 允许最多31个参数,在调用者的堆栈里。发生切换时,将从调用者的堆栈里复制到新的堆栈里。

 
 

切换后堆栈结构图:

calling procedure         called procedure

… …

param1

Param2

Param3

… …

 

… …

calling SS

calling ESP

param1

param2

param3

calling CS

calling EIP

... ...

… …

 



评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值