对于CPL,DPL,RPL的新疑惑
Windows内核调试
对于CPL,DPL,RPL的新疑惑
阿龙
2010-10-27, 13:39 下午
只谈代码段:
网上有关于CPL, DPL, RPL的很多解释,但我还是有一些疑惑:
1. RPL的调整是CPU进行的?还是操作系统?还是程序员?
2. CPL到底保存在哪里?CS寄存器(物理角度)的[1:0]位?
3. 和2相关的问题就是,RPL到底保存在哪里?在代码中,选择子一般是个常量,包含了索引值及TI位,但并没有指定RPL,在转移的时候,类似于这样的指令,jmp selector:offset,那么RPL在哪里呢?是不是有一块大小和选择子一样的内存被分配,然后填入索引,TI位,并且写入RPL,然后才执行验证?
4. 我在看杨继文的书时,里面对于向目标代码段转移的步骤有如下的描述:
a. 判断是否为空描述符
b. 从全局/局部描述符表内读出描述符(已经读出了描述符!!!)
c.
根据情况,检测描述符类型是否正确;调整RPL
d. 装载至CS告诉缓冲寄存器
e. ......
f. ......
我的疑问是第C步骤,根据什么情况?检测什么类型?如何调整RPL?
5. 在程序运行的任何时刻,各个段寄存器里的低2位是不是没有什么用途(除了CS[1:0],如果CPL是保存在那里的话),因为在转移的时候,需要的是CPL,在某个位置存在的RPL和目标段的DPL?
很多问题,期待前辈能予以解答,严重迷惑中...
谢谢!!