我们之前一直搞不懂这三者的权限检查以及关系,这篇文章我们来梳理一下三者的关系。
DPL - 段描述符表,用于访问该段的特权级别,是段描述符的一部分;
CPL - 当前段的描述级别,放在代码段寄存器的低两位中,表示当前CPU的处理级别;
RPL - 段选择子的一部分,用于指定请求访问段的特权级别。
区分DPL与RPL,一个是段描述符表,一个是段选择子。
比如我们要进入零环,此时ds的值要改为零环,有这个汇编代码 "mov ds, ax(零环的段选择子)",此时就要来进行相关权限检查,如果权限检查通过,就加载段描述符表。而ax中保存着RPL,段描述符中保存着DPL。
RPL相当于DPL的一个大门,来拦截非法访问,有公式 max(CPL, RPL) <= DPL,我们人为设计了一道大门,当mov ds,ax加载成功了,我们就可以访问零环代码段的数据,但是在这之前必须经过段选择子,如下,有下面四种情况。
① 是一个标准的零环代码段的情况,现在来分析,当CPL = 3时,其直接max = 3 > DPL = 0,直接禁止访问;当CPL = 0 时,都处于内核的情况,直接可以访问。
② 同理,访问三环的数据,哪怕零环也是可以做到的。
③ 这种情况是不可能发生的,三环的权限来请求零环的代码,这当然是不可能的。
④ 这种情况有些多余,这个是可以加载成功的,访问三环的代码段。