易水请进,达人请进:关于iretd的问题

robin97 2004-11-20 08:43:38
我想用iretd从特权级0转到特权级3,我构造了一个iretd的返回地址,但是有问题。
所有的段都是0-4G。开分页模式,保证不出现缺页情况。
当我用的选择子的dpl = 0并且把rpl = 0的时候,执行没有问题。
但是我把选择子的dpl = 3并且把rpl = 3的时候,什么反应也没有了。我用vpc来做实验的,vpc的窗口没有关闭,也没有任何提示,就这么挂了…………一般情况下,如果代码有什么不对的话,vpc要么探出一个对话框然后重启,或者干脆vpc窗口直接就没有了,但是……VPC连反应都没有,堆栈异常和通用保护异常我已经可以捕获了,但是什么也没有捕获…………
构造代码是,是c中嵌入汇编
unsigned long
GDT[] = {
0x00000000,0x00000000,/* 空描述符 0 0 */
0x0000ffff,0x00cf9a00,/* 内核代码段描述符 特权级0 1 8 */
0x0000ffff,0x00cf9200,/* 内核数据段描述符 特权级0 2 16 */
0x0000ffff,0x00cffa00,/* 任务代码段描述符 特权级3 3 24 */
0x0000ffff,0x00cff200,/* 任务数据段描述符 特权机3 4 32 */
};
#define RING0_TEXT_SELECTOR 1*8
#define RING0_DATA_SELECTOR 2*8
#define RING3_TEXT_SELECTOR 3*8 + 3
#define RING3_DATA_SELECTOR 4*8 + 3
// 这个执行了就不动了,完全没有反应
asm{
mov eax,esp
push RING3_DATA_SELECTOR ;
push eax
pushfd
push RING3_TEXT_SELECTOR ; // 如果把这里换成RING3_TEXT_SELECTOR - 3,
; // 我捕获到通用保护异常
push offset myentry
iretd
}
// 这个正常执行
asm{
mov eax,esp
push RING0_DATA_SELECTOR ;
push eax
pushfd
push RING0_TEXT_SELECTOR
push offset myentry
iretd
}
...全文
194 8 打赏 收藏 转发到动态 举报
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
Areslee 2004-11-21
  • 打赏
  • 举报
回复
0.0.1本来就是不完善的代码
反正偶自己测试是必须要建议了TSS并装TR才能特权转移
robin97 2004-11-21
  • 打赏
  • 举报
回复
向外层返回的时候,外层堆栈不就是从内层堆栈弹出嘛?
而且vpc那个完全没有了反应又是怎么回事?
robin97 2004-11-21
  • 打赏
  • 举报
回复
而且从iretd指令里面不就有这个功能了吗?intel的手册上面都提到了(vol3-346),可以直接向外层返回.
robin97 2004-11-21
  • 打赏
  • 举报
回复
那个linux的代码是怎么回事?那是0.0.1版本的,我没有见到他在哪里处理过阿
Areslee 2004-11-21
  • 打赏
  • 举报
回复
不是,是需要提前处理,然后每次特权特转换时使用现在设置就行
比如你要进R3,你至少要设置好R3堆栈吧?
robin97 2004-11-20
  • 打赏
  • 举报
回复
而且有个问题,照你这么说,如果在r3发生中断或者触发陷阱后,返回的时候都要设置和处理tss和tr?
robin97 2004-11-20
  • 打赏
  • 举报
回复
#define move_to_user_mode() \
__asm__ ("movl %%esp,%%eax\n\t" \
"pushl $0x17\n\t" \
"pushl %%eax\n\t" \
"pushfl\n\t" \
"pushl $0x0f\n\t" \
"pushl $1f\n\t" \
"iret\n" \
"1:\tmovl $0x17,%%eax\n\t" \
"movw %%ax,%%ds\n\t" \
"movw %%ax,%%es\n\t" \
"movw %%ax,%%fs\n\t" \
"movw %%ax,%%gs" \
:::"ax")
不用吧?上面的就是linux转换代码,没用到tss啊,只用到ldt阿
Areslee 2004-11-20
  • 打赏
  • 举报
回复
r0到r3不是这么容易就行的,必须设置TSS和TR

21,458

社区成员

发帖
与我相关
我的任务
社区描述
汇编语言(Assembly Language)是任何一种用于电子计算机、微处理器、微控制器或其他可编程器件的低级语言,亦称为符号语言。
社区管理员
  • 汇编语言
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧