我对他们的关系理解是这样:一般来说,CPL代表当前代码段的权限,如果它想要去访问一个段或门,首先要看看对方的权限如何,也就是检查对方的DPL,如果满足当前的权限比要访问的权限高,则有可能允许去访问,有些情况我们还要检查选择子的权限,即RPL,因为我们通过选择子:偏移量的方式去访问一个段,这算是一个访问请求动作...
解析 答:RPL为请求特权级,它在选择字中设置,通过它可影响特权测试的结果;DPL为描述符特权级,它在描述符中设置,它规定了可以访问该描述符的任务的最低特权级;CPL为当前特权级,它就是当前运行的任务的代码段描述符中的DPL,每当任务的代码段选择字装入CS寄存器时,CPU自动把CPL存储到CS的RPL字段。
要求访问数据段或堆栈段的程序的CPL≤待访问的数据段或堆栈段的DPL,同时选择子的RPL≤待访问的数据段或堆栈段的DPL,即程序访问数据段或堆栈段要遵循一个准则:只有相同或更高特权级的代码才能访问相应的数据段。这里,RPL可能会削弱CPL的作用,访问数据段或堆栈段时,默认用CPU和RPL中的最小特权级去访问数据段,所以m...
RPL引入的目的是避免低特权级的程序访问高特权级的资源,有了RPL后,访问内存段的特权检查规则如下(不通过调用门): ·如果目标为非一致性代码段,要求数值上:CPL=RPL=目标代码段DPL ·如果目标为一致性代码段,要求数值上:CPL≤目标代码段DPL && RPL≥目标代码段DPL ·如果目标为数据段时,要求数值上:CPL≤目标数据...
DPL: 全称descriptor privilege level,存放在段描述符中,用于表示段的特权级 在保护模式下,cpu利用cpl/rpl/dpl对程序的访问操作进行特权级检查,数据段和代码段的特权级检查规则有所不同。 数据段和堆栈段: 数据段和堆栈段访问的特权级检查比较简单,只需cpl <= 目标段dpl 且 rpl <= 目标段dpl便可成功访问,即...
DPL 存储于段描述符中: 存储于段选择子(段选择子存储于各个段寄存器以及门描述符中-调用门、任务门、中断门、陷阱门)中: RPL 是请求特权级,表示给出当前选择子的那个程序的特权级别,正是该程序要求访问这个内存段。 CPL 存储于CS寄存器的段选择子中(CS中的RPL就是CPL): IOPL 存储于EFLAGS中: 正在运行任务的...
数据段中DPL规定了可以访问此段的最低特权级,因此,对数据的访问,只要CPL和RPL都小于被访问的数据段的DPL就可以了,即CPL<=DPL和RPL<=DPL。 五、不同特权级代码段之间的转移 使用jmp或call指令可以实现下列4种转移 (1)目标操作数包含目标代码段的段选择子。
程序的CPL(CS.RPL)是CS register 里bit 0和bit 1 位组合所得的值.在某一时刻就只有这个值唯一的代表程序的CPL. 而DPL是段描述符中的特权级, 它的本意是用来代表它所描述的段的特权级. 一个程序可以使用很多段(Data,Code,Stack)也可以只用一个code段等.在正常的情况下当程序的环境建立好后,段描述符都不...
很久以后,等我大量翻阅关于“保护模式的特权级检查(DPL,RPL,CPL, 一致代码段,非一致代码段)”的资料后,我才发现这篇博客理解得太肤浅了,而且有错(但后面的实验步骤和代码还是可以凑合看一下的),因此特意写了另一篇(主要是转载),名为“(第三章 8 )特权级——保护模式的特权级检查(DPL,RPL,CPL, 一致代码段...
if ((CPL <= DPL) && (RPL <= DPL)) { /* 允许访问 */ } else { /* 失败,#GP 异常生产,执行异常 */ } 也就是要访问目标data segment,那么必须要有足够的权限,这个足够的权限就是:当前运行的权限级别及选择子的请求权限级别要高于等于目标data segment的权限级别。