特权级检查规则

特权级检查规则

Content #

我们来总结一下基本的特权级检查规则。

  1. 将控制直接转移到非依从的代码段要求当前特权级CPL 和请求特权级 RPL 都等于目标代码段描述符的DPL。即,在数值上

CPL = 目标代码段描述符的DPL RPL = 目标代码段描述符的DPL 一个典型的例子就是使用jmp 指令进行控制转移: jmp 0x0012:0x00002000 因为两个代码段的特权级相同,故,转移后当前特权级不变。

  1. 将控制直接转移到依从的代码段要求当前特权级CPL 和请求特权级RPL 都低于,或者和目标代码段描述符的 DPL 相同。即,在数值上,

CPL >= 目标代码段描述符的DPL RPL >= 目标代码段描述符的DPL 控制转移后,当前特权级保持不变。通过门实施的控制转移,其特权级检查规则另外处理。

  1. 高特权级别的程序可以访问低特权级别的数据段,但低特权级别的程序不能访问高特权级别的数据段。访问数据段之前,肯定要对段寄存器DS、ES、FS 和GS 进行修改,比如: mov fs, ax 在这个时候,要求当前特权级CPL 和请求特权级RPL 都必须高于,或者和目标数据段描述符的DPL 相同。即,在数值上,

CPL <= 目标代码段描述符的DPL RPL <= 目标代码段描述符的DPL

  1. 栈段的特权级别必须和当前特权级CPL 相同。随着程序的执行,要对段寄存器SS 的内容进行修改时,必须进行特权级检查。以下就是一个修改段寄存器SS 的例子: mov ss, ax 在对段寄存器SS 进行修改时,要求当前特权级CPL 和请求特权级RPL 必须等于目标栈段描述符的DPL。即,在数值上,

CPL = 目标代码段描述符的DPL RPL = 目标代码段描述符的DPL

0 特权级是最高的特权级别,当一个系统的各个部分都位于0 特权级时,各种特权级检查总能够获得通过,就像这种检查和检验并不存在一样。所以,处理器的设计者建议,如果不需要使用特权机制的话,可以将所有程序的特权级别都设置为0,就像我们一直所做的那样。

From #