在保护模式下提供4级特权级PL(Privilege Level),呈现环形保护(ring-protection)结构。最内的环具有PL=0的最高特权级,依内向外逐层PL值增加,特权级降低。最外的环PL=3,特权级最低。
特权级有以下几种形式表述:DPL(Descriptor Privilege Level):描述符的特权级,CPL(Current Privilege Level):当前任务的特权级,RPL(Requestor Privilege Level):请求特权级(选择符的特权级),EPL(Effective Privilege Level):有效特权级,IOPL(I/O Privilege Level):I/O特权级 ,目前Windows,Linux等只用到了其中两级,即:0级(核心态)和3级(用户态).
1、描述符特权级DPL(Discriptor PL),出现于段描述符中的b46,b45,表示此段所具有的特权级。可以把DPL比喻成档案馆中资料文件的保密级别。
2、DPL是一个段或门的特权级,它保存在用于段或门的段描述符或门描述符的DPL域中,在当前执行的代码段企图访问一个段或门时,段或门的DPL便与段选择子或门选择子的CPL和RPL进行比较。根据被访问段或门的类型不同,DPL存在如下的区别:
·数据段:其DPL说明能够访问该数据段的程序或任务必须具有的最低特权级(拥有大的特权数)。例如,如果数据段的DPL是1,则只有运行在CPL为0或1的程序能够访问该段。
·非一致性代码段(无需通过一个调用门):其DPL说明访问该段的程序或任务所必须具有的最低特权级。例如,如果非一致性代码段的DPL是0,则只有运行在CPL为0的程序才能够访问该段。
·调用门,其DPL说明能够访问该调用门的程序或任务必须具有的最低特权级。与数据段的访问规则相同。
·一致性代码段:其DPL说明能够访问该段的程序或任务应该具有的最高特权级(即最小的特权级数)。例如,如果一致性代码段的DPL为2,则运行在CPL为0或1的程序是不能访问该段的。
·任务状态段TSS:其DPL说明能够访问该TSS的程序或任务必须保持的最低特权级(即最大的特权数)。与数据段的访问规则相同。
3、选择符特权级也称请求特权级RPL(Requested PL),出现于选择符中的b1,b0 ,表示本次访问所要求的特权级。可以把RPL比喻成申请查阅文件人的密级。
当前特权级CPL(Current PL),这是指CPU当前正在执行代码段的特权级。多数情况下它既是当前CS寄存器(选择符)的b1,b0位值,也同于这个当前代码段的DPL。可以把CPL比喻成正在开放的档案馆的密级。当程序控制切换到具有不同特权级的代码段时,处理器改变CPL,当访问一致性代码段时,对CPL的处理不同,这种段能够被任何特权级数等于或大于(具有较低特权级)这种代码段DPL的过程所访问,当处理器访问这种与CPL具有不同特权级的代码段时,CPL是不能改变的。
4、EPL = MAX( 选择子的RPL ,程序当前特权级(CPL) )
当一个段描述符的段选择子装载到一个段寄存器时,进行特权级的检查。对于数据段中数据的访问与对代码段中程序控制转换的访问是不同的,因此,必须单独考虑对这两者不同的访问。
1、数据段寄存器要被加载时,在处理器将一个段选择子装载到段寄存器之前,必须比较当前运行程序或任务的CPL、段选择子的RPL和预加载段描述符的DPL,进行特权级的检查。否则,将产生一个一般保护故障,不装载段寄存器,即要求满足
DPL数据段描述符≥MAX(CPL现行代码段,RPL数据段选择子)
从不同特权级访问数据段的举例:
当CPL为0时,处于所有特权级的数据段都是可以被访问的;当CPL为1时,只有特权级为1到3的数据段才能被访问,当CPL为3时,只有特权级为3的数据段可以被访问。
当为一个堆栈段的SS寄存器装载段选择子时,也必须进行特权级的检查,所有与堆栈段相关的特权级必须与CPL匹配,也就是说,堆栈段选择子的CPL = RPL= 堆栈段描述符的DPL。.每个特权级都有各自独立的程序堆栈,以避免与共享有关的保护问题.当一个程序以一个特权级切换到另外一个特权级时,程序堆栈要切换.
2、任务切换时(不使用任务门,直接任务转换,通过JMP/CALL指令的操作数访问新任务的TSS):若CPL阈值等于或小于TSS描述符中DPL阈值,访问TSS描述符的程序或过程都能够通过调用或跳转来派遣任务。在大多数系统中,TSS描述符中的DPL阈值应该设置成小于3的值,以便只有具有一定特权的软件才能执行任务的切换。然而,在多任务应用程序中一些TSS描述符的DPL能够设置为3,以允许用户特权级的应用程序执行任务切换。
DPL TSS描述符≥MAX(CPL现行特权,RPL新任务的段选择子)
3、在任务切换期间(使用任务门,间接任务转换,通过JMP/CALL指令转到GDT/LDT中的任务门描述符,或者通过中断/异常矢量指向IDT中的任务门描述符):任务门描述符的DPL控制着对TSS描述符的访问,当一个程序或过程通过一个任务门来调用或跳转到一个任务时,指向任务门选择子的CPL和RPL域值必须小于或等于任务门描述符的DPL域值,即:
DPL任务门≥MAX(CPL现行特权,RPL指向任务门的选择子)
通过指令JMP或CALL跳转到其他的代码段有下面四种方式:
①目标操作数中包含有目标代码段的段选择子。
②目标操作数指向一个调用门描述符,该描述符包含目标代码段的段选择子。
③目标操作数指向一个TSS,该TSS包含目标代码段的段选择子。
④目标操作数指向一个任务门,该任务门指向一个包含目标代码段段选择子的TSS。
1.直接调用或跳转到代码段 (同特权级转移)
指令JMP、CALL和RET控制程序进行近转移,且在当前的代码段内完成,因而无需进行特权级的检查。而对于远转移的情况,处理器则需要进行特权级的检查。
当控制程序切换到另一个代码段、无需通过一个调用门时,处理器检查四种类型的特权级和类型信息,即:调用代码段的当前特权级CPL,该代码段包含有调用或跳转过程;目标代码段的段描述符DPL,该代码段包含有被调用过程;目标代码段段选择子的RPL:类型信息为目标代码段段描述符中的一致性标志位C,该标志位C用于决定段是一个一致性(设置C)还是一个非一致性(清除C)的代码段。