当前位置: 代码迷 >> 汇编语言 >> 80x86 retf如何特权转移
  详细解决方案

80x86 retf如何特权转移

热度:7211   发布时间:2013-02-26 00:00:00.0
80x86 retf怎么特权转移
怎么用RETF从0级跳到3 要TSS段不
当前0级
push ss0
push ss0eip
push code3
push code3ip
retf
能跳吗 没放TSS BOCHS运行到RETF错误

------解决方案--------------------------------------------------------
1,特权级之间的控制转移需要切换堆栈 => 需要先定义特权级3的堆栈
2,特权级之间的控制转移需要切换堆栈 => 处理器会从TSS中取得堆栈选择子 => 不定义TSS万万不能。

编译器恐怕不能自动推测内存操作数的尺寸吧?所以,除了以上的要求外,我想应该这样:
Assembly code
push dword ss0push dword ss0eippush dword code3push dword code3ipretf
------解决方案--------------------------------------------------------
楼主最好贴一下代码!不知道是不是特权级的检查出问题啦!

push 堆栈的选择子
push ss0eip
push 代码的选择子
push code3ip
retf

这样的话照理说应该可以实现的

TSS是当从低特权级到高特权级转变的时候需要的

没有看代码,不是很确定

------解决方案--------------------------------------------------------
要用tss的,切换堆栈时需要从中取堆栈选择子的
------解决方案--------------------------------------------------------
是的。
楼主需要考虑的是处理器的工作。处理器的检查工作如下:
1,读返回的段选择子;
2,如果堆栈选择子是0,#GP(0);
3,如果堆栈选择子索引号超出所在描述符表的范围,#GP(选择子);
4,读由返回的段选择子所指向的段描述符;
5,如果堆栈段选择子的RPL不等于返回代码段选择子的RPL,或者堆栈段非可写的数据段,或者堆栈段描述符的DPL不等于返回代码段的RPL,那么,#GP(选择子);
6,如果堆栈段不存在,#SS(堆栈段选择子);
7,如果返回的指令指针不在返回代码段的段界限内,#GP(0)。


探讨

从0级用RETF跳到3级只要 3级的堆栈选择子呀TSS里好像没有堆栈3的选择子吧