描述符属性
一致与非一致
- 当转移的目标是一个特权级更高的一致代码段,当前的
特权级会被延续下去 - 而向特权级更高的非一致代码段的转移会引起常规保护错误,除非使用调用门或者任务门。
- 如果系统代码不访问受保护的资源和某些类型的异常处理,它可以被放在一致代码段中。为避免低特权级的程序访问而被保护起来的系统代码则应放到非一致代码段中。
- 如果目标代码的特权级低的话,无论它是不是一致代码段,都不能通过call或者jmp转移进去,尝试这样的转移将会导致常规保护错误。
- 所有的数据段都是非一致的,这意味着不可能被低特权级的代码访问到。
- 数据段可以被更高特权级的代码访问到,而不需要使用特定的门。
代码解释
- 在之前的代码中,可以看到代码段的属性是
"DA_C + DA_32"
- 在
pm.inc
中有定义:; 描述符类型 DA_32 EQU 4000h ; 32 位段 DA_DPL0 EQU 00h ; DPL = 0 DA_DPL1 EQU 20h ; DPL = 1 DA_DPL2 EQU 40h ; DPL = 2 DA_DPL3 EQU 60h ; DPL = 3 ; 存储段描述符类型 DA_DR EQU 90h ; 存在的只读数据段类型值 DA_DRW EQU 92h ; 存在的可读写数据段属性值 DA_DRWA EQU 93h ; 存在的已访问可读写数据段类型值 DA_C EQU 98h ; 存在的只执行代码段属性值 DA_CR EQU 9Ah ; 存在的可执行可读代码段属性值 DA_CCO EQU 9Ch ; 存在的只执行一致代码段属性值 DA_CCOR EQU 9Eh ; 存在的可执行可读一致代码段属性值 ; 系统段描述符类型 DA_LDT EQU 82h ; 局部描述符表段类型值 DA_TaskGate EQU 85h ; 任务门类型值 DA_386TSS EQU 89h ; 可用 386 任务状态段类型值 DA_386CGate EQU 8Ch ; 386 调用门类型值 DA_386IGate EQU 8Eh ; 386 中断门类型值 DA_386TGate EQU 8Fh ; 386 陷阱门类型值
- DA_C 是98h,对应的二进制是 1001 1000;DA_32是4000h,对应的二进制是 0100 0000 0000 0000
P位是1表明这个段在内存中存在,S位是1表明这个段是代码段或者数据段,TYPE=8表明这个段是个代码段,且是只执行的代码段。
,由于这个段是代码段,D位是1表明这个段是32位的代码段。所以,这个段是存在的只执行的32位代码段,DPL为0。