首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 嵌入开发 > 汇编语言 >

80x86 retf如何特权转移

2012-04-13 
80x86 retf怎么特权转移怎么用RETF从0级跳到3 要TSS段不当前0级push ss0push ss0eippush code3push code3i

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的选择子吧

热点排行