当前位置: 代码迷 >> 汇编语言 >> 关于调用门中CPL,DPL和RPL有关问题
  详细解决方案

关于调用门中CPL,DPL和RPL有关问题

热度:1290   发布时间:2013-02-26 00:00:00.0
关于调用门中CPL,DPL和RPL问题
当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描述符设置正确,这个是关键
  相关解决方案