在保护模式下,特权级总共有4个,编号从0(最高特权)到3(最低特权)。三类主要的资源,即内存、I/O地址空间以及特权指令需要保护。特权指令如果被用户态的程序所使用,就会受到保护模式的保护机制限制,导致一个故障中断(general-protection exception)。对内存和I/O端口的访问存在类似的特权级限制。为了更好地理解不同特权级,这里先介绍三个概念
- CPL:当前特权级(Current Privilege Level) 保存在CS段寄存器(选择子)的最低两位,CPL就是当前活动代码段的特权级,并且它定义了当前所执行程序的特权级别)
- DPL:描述符特权(Descriptor Privilege Level) 存储在段描述符中的权限位,用于描述对应段所属的特权等级,也就是段本身真正的特权级。
- RPL:请求特权级RPL(Request Privilege Level) RPL保存在选择子的最低两位。RPL说明的是进程对段访问的请求权限,意思是当前进程想要的请求权限。RPL的值由程序员自己来自由的设置,并不一定RPL>=CPL,但是当RPL<CPL时,实际起作用的就是CPL了,因为访问时的特权检查是判断:max(RPL,CPL)<=DPL是否成立,所以RPL可以看成是每次访问时的附加限制,RPL=0时附加限制最小,RPL=3时附加限制最大。