当CPL=3的代码段调用一个调用门调用一个DPL=0的代码段,此时DPL=0的代码段可以访问DPL=0的数据段么,或者DPL=0的代码段可以访问比RPL(RPL=3)高的数据段么,那么DPL=0的代码段,可以访问哪些特权级别的代码段和数据段?
贴出部分代码以供参考
- Assembly code
[section .ldt][BITS 16]LABEL_LDT: ;这里为什么DPL要于RPL一样呢? ldtcode32: descriptor 0ffffh,0000h,00h,ACER | AC_D + DA_DPL3 ,00h ldtcode32_sel equ ldtcode32 - LABEL_LDT + SA_TIL +RA_RPL3 ;调用门目标段代码 labelcallgatecode32: descriptor 0ffffh, 0000h,00h, ACER | AC_D + DA_DPL3,00h labelcallgatecode32_sel equ labelcallgatecode32 - LABEL_LDT + SA_TIL +RA_RPL3 data32_ldt: descriptor 0ffffh,0000h,00h,ADRW,00h data32_ldt_sel equ data32_ldt - LABEL_LDT + SA_TIL + RA_RPL3 call_gate32: ;把gate的类型写成ACER | AC_D + DA_DPL3 gate 0000h,labelcallgatecode32_sel , 00h , GA_386CALL + DA_DPL3 ,00h call_gate32_sel equ call_gate32 - LABEL_LDT + SA_TIL + RA_RPL3 call_gate32tocode16: ;把gate的类型写成ACER | AC_D + DA_DPL3 gate 0000h , code16_sel , 00h , GA_386CALL + DA_DPL3 ,00h call_gate32tocode16_sel equ call_gate32 - LABEL_LDT + SA_TIL + RA_RPL3 LDTLEN equ $ - LABEL_LDT ;end of [section .ldt];--------------------------------------------万恶的分界线------------------------------------------;特权级别为3[section .s322][BITS 32]ldtpt: mov ax , 01234h ;call call_gate32_sel:0 call labelcallgatecode32_sel:0 call call_gate32tocode16_sel:0;end of [section .s322][section .callgate32][BITS 32];0级权限,但是通过gate能被ldtpt这个3级权限的code segment调用labelcallgate: mov ax , 1000h mov ax , data32_ldt mov si , (80 * 8 + 1) * 2 mov byte [es:si] , 'C' inc si mov byte [es:si] , 01101100b mov ax , data32 mov si , (80 * 8 + 2) * 2 mov byte [es:si] , 'X' inc si mov byte [es:si] , 01101100b retf ;jmp dword code16_sel:0 ;end of [section .callgate32][section .s162]
------解决方案--------------------------------------------------------
3级跳到0级用 trap 或者 intr 或者system gage ,0级回到3级用 iret(d),RPL 为0 就是内核模式。RPL不能低于DPL,不能说你想设定几就是几......
------解决方案--------------------------------------------------------
gate ,打错字了
------解决方案--------------------------------------------------------
请把bochs 提示的错误贴出来。。
------解决方案--------------------------------------------------------
先检查你GDT描述符,LDT描述符设置正确,这个是关键