- 论坛徽章:
- 0
|
原帖由 peimichael 于 2009-6-12 11:29 发表
你只管call和ret
堆栈切换,保存ss,esp,cs,ip这些都是cpu自动完成的。
cpu会自动把ring1的ss和esp保存在ring0栈里,ret返回的时候自动装回寄存器
中间还有很多复杂的权限检查等过程都由cpu自动完成
我之所以要弄清楚堆栈的情况,那是因为这实在是很重要。
回到主题,peimichael,你说的"cpu会自动把ring1的ss和esp保存在ring0栈里,ret返回的时候自动装回寄存器",我就很疑惑。举个例子,
假设:程序A(运行在ring0),程序dest(运行在ring2)。
1、程序A的代码如下(只是示意用的):
........
retf/ired dest
.......
2、将程序A的代码稍作改动,形成程序B的代码如下:
........
push x
push y
........
push z
........
retf/iretd dest
........
pop z
pop y
pop x
程序A和程序B的分别在于多了对 stack0的一些push/pop操作,显然在执行 retf/iretd dest 之前,程序B的堆栈内容已变了。假设程序A中所有的省略部分都不涉及 stack0 的操作,OK,你所说的cpu可以自动从stack0中找到ss1:esp1。但如果是程序B这种情况呢?在程序B的这种情况下cpu如何自动获知stack0中的ss1:esp1?
上面的只是一个例子,现实中应该还有更复杂的.......
[ 本帖最后由 ts0612 于 2009-6-12 12:14 编辑 ] |
|