关于保护模式编程的几个问题
处理器在执行上述段间转移指令向目标代码段实施转移的过程中,一般至少要经过如下步骤:
(1)判断目标地址指针内的选择子指示的描述符是否为空描述符。空描述符是GDT中的第0个描述符,是一个特殊的描述符。目标代码段描述符不能为空描述符,也即选择子的高14位不能为0。
(2)从全局或局部描述符表内读出目标代码段描述符。由选择子内的TI位,确定使用全局描述符表还是局部描述符表。
(3)根据情况,检测描述符类型是否正确;调整RPL。这里是啥意思?
(4)把目标代码段描述符内的有关内容装载到CS高速缓冲寄存器。
(5)判断目标地址指针内的偏移是否越出代码段的界限。目标地址指针内的偏移必须不超过目标代码段界限。
(6)装载CS段寄存器和指令指针寄存器EIP;CPL存入CS内选择子的RPL字段。
上述步骤只是对转移过程的简单说明,实际的动作还要复杂。在把目标代码段描述符内的有关内容转载到CS高速缓冲寄存器时,还要进行如下保护检测,其中的DPL表示目标代码段描述符的特权级:
(1)对于非一致代码段,要求CPL=DPL,RPL<=DPL;对于一致代码段,要求CPL>=DPL。
(2)代码段必须存在,即描述符中的P位必须是1。