易水请进,达人请进:关于iretd的问题
我想用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
}