特权级在保护模式下的应用

在保护模式下提供4级特权级PLPrivilege 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、描述符特权级DPLDiscriptor PL,出现于段描述符中的b46b45,表示此段所具有的特权级。可以把DPL比喻成档案馆中资料文件的保密级别。

2DPL是一个段或门的特权级,它保存在用于段或门的段描述符或门描述符的DPL域中,在当前执行的代码段企图访问一个段或门时,段或门的DPL便与段选择子或门选择子的CPLRPL进行比较。根据被访问段或门的类型不同,DPL存在如下的区别:

  ·数据段:DPL说明能够访问该数据段的程序或任务必须具有的最低特权级(拥有大的特权数)。例如,如果数据段的DPL1,则只有运行在CPL01的程序能够访问该段。

  ·非一致性代码段(无需通过一个调用门):其DPL说明访问该段的程序或任务所必须具有的最低特权级。例如,如果非一致性代码段的DPL0,则只有运行在CPL0的程序才能够访问该段。

  ·调用门,其DPL说明能够访问该调用门的程序或任务必须具有的最低特权级。与数据段的访问规则相同。

  ·一致性代码段:DPL说明能够访问该段的程序或任务应该具有的最高特权级(即最小的特权级数)。例如,如果一致性代码段的DPL2,则运行在CPL01的程序是不能访问该段的。

  ·任务状态段TSSDPL说明能够访问该TSS的程序或任务必须保持的最低特权级(即最大的特权数)。与数据段的访问规则相同。

3、选择符特权级也称请求特权级RPLRequested PL),出现于选择符中的b1,b0 ,表示本次访问所要求的特权级。可以把RPL比喻成申请查阅文件人的密级。

当前特权级CPLCurrent PL),这是指CPU当前正在执行代码段的特权级。多数情况下它既是当前CS寄存器(选择符)的b1b0位值,也同于这个当前代码段的DPL可以把CPL比喻成正在开放的档案馆的密级。当程序控制切换到具有不同特权级的代码段时,处理器改变CPL,当访问一致性代码段时,对CPL的处理不同,这种段能够被任何特权级数等于或大于(具有较低特权级)这种代码段DPL的过程所访问,当处理器访问这种与CPL具有不同特权级的代码段时,CPL是不能改变的。

4EPL = MAX( 选择子的RPL ,程序当前特权级(CPL)

 

当一个段描述符的段选择子装载到一个段寄存器时,进行特权级的检查。对于数据段中数据的访问与对代码段中程序控制转换的访问是不同的,因此,必须单独考虑对这两者不同的访问。

       1数据段寄存器要被加载时,在处理器将一个段选择子装载到段寄存器之前,必须比较当前运行程序或任务的CPL、段选择子的RPL和预加载段描述符的DPL,进行特权级的检查。否则,将产生一个一般保护故障,不装载段寄存器,即要求满足

  DPL数据段描述符≥MAXCPL现行代码段,RPL数据段选择子)

从不同特权级访问数据段的举例:

CPL0时,处于所有特权级的数据段都是可以被访问的;当CPL1时,只有特权级为13的数据段才能被访问,当CPL3时,只有特权级为3的数据段可以被访问。

当为一个堆栈段的SS寄存器装载段选择子时,也必须进行特权级的检查,所有与堆栈段相关的特权级必须与CPL匹配,也就是说,堆栈段选择子的CPL = RPL= 堆栈段描述符的DPL.每个特权级都有各自独立的程序堆栈,以避免与共享有关的保护问题.当一个程序以一个特权级切换到另外一个特权级时,程序堆栈要切换.

 

2、任务切换时(不使用任务门,直接任务转换,通过JMP/CALL指令的操作数访问新任务的TSS)CPL阈值等于或小于TSS描述符中DPL阈值,访问TSS描述符的程序或过程都能够通过调用或跳转来派遣任务。在大多数系统中,TSS描述符中的DPL阈值应该设置成小于3的值,以便只有具有一定特权的软件才能执行任务的切换。然而,在多任务应用程序中一些TSS描述符的DPL能够设置为3,以允许用户特权级的应用程序执行任务切换。

DPL  TSS描述符≥MAXCPL现行特权,RPL新任务的段选择子)

 

3、在任务切换期间(使用任务门,间接任务转换,通过JMP/CALL指令转到GDT/LDT中的任务门描述符,或者通过中断/异常矢量指向IDT中的任务门描述符):任务门描述符的DPL控制着对TSS描述符的访问,当一个程序或过程通过一个任务门来调用或跳转到一个任务时,指向任务门选择子的CPLRPL域值必须小于或等于任务门描述符的DPL域值,即:

     DPL任务门≥MAXCPL现行特权,RPL指向任务门的选择子)

通过指令JMPCALL跳转到其他的代码段有下面四种方式:

  ①目标操作数中包含有目标代码段的段选择子。

  ②目标操作数指向一个调用门描述符,该描述符包含目标代码段的段选择子。

  ③目标操作数指向一个TSS,该TSS包含目标代码段的段选择子。

④目标操作数指向一个任务门,该任务门指向一个包含目标代码段段选择子的TSS

 

 1.直接调用或跳转到代码段 (同特权级转移)

  指令JMPCALLRET控制程序进行近转移,且在当前的代码段内完成,因而无需进行特权级的检查。而对于远转移的情况,处理器则需要进行特权级的检查。

  当控制程序切换到另一个代码段、无需通过一个调用门时,处理器检查四种类型的特权级和类型信息,即:调用代码段的当前特权级CPL,该代码段包含有调用或跳转过程;目标代码段的段描述符DPL,该代码段包含有被调用过程;目标代码段段选择子的RPL类型信息为目标代码段段描述符中的一致性标志位C,该标志位C用于决定段是一个一致性(设置C)还是一个非一致性(清除C)的代码段。

  1)当访问一个非一致性代码段时,调用过程的CPL必须等于目标代码段的DPL,称同级调用,即CPL=DPL非一致目标。否则,处理器将产生一个常规保护异常#GP。指向非一致性代码段的段选择子的RPL必须在特权级检查时进行限制,即CPLRPL指向非一致代码段,也就是调用过程比被调用过程的特权级更低,才能调用成功。所以,如下图中,段选择子C1D1RPL可被设置为0l2,但不能是3。可综合表示如下:

  DPL非一致目标 = CPL调用过程 RPL指向非一致代码

当非一致性代码段的段选择子装载到CS寄存器时,特权级域不变,也就是说,它保留了调用过程的CPL,即使段选择子的RPL不同于CPL时也是如此。

2)当访问一致性代码段时,DPL一致性目标 ≤ CPL调用过程。

当程序控制切换到一致性代码段时,CPL不改变,即使目标代码段的DPL在数字上小于CPL,这种情况也只发生在CPL与当前代码段的DPL不同的地方,(不会发生特权级的切换)[参看一致的代码段的概念]

大多数代码段都是非一致性,对于这些段,只能控制程序切换到具有相同特权级的代码段,除非通过一个调用门来执行转换。

2、通过调用门访问一个代码段(不同特权级转换)

为了访问一个调用门,必须在指令CALLJMP的操作数中提供一个指向调用门的远指针,来自于该指针的段选择子指定调用门。

通过对特权级的检查,可以得到由一个调用门控制程序切换的有效性。其特权级有四种:当前特权级CPL调用门选择子的请求特权级RPL调用门描述符的描述符特权级DPL 目标代码段段描述符的DPL。此外,还要检查目标代码段的段描述符中的标志位C。由CALL指令还是由JMP指令引起程序控制转换的不同,对特权级的检查也不同,如下图:

A, 调用门描述符的DPL域指定一个调用过程能够访问调用门的最低特权级,也就是说,为了访问一个调用门,一个调用过程的CPL的值必须等于或小于调用门的DPL

B, 一个调用门段选择子的RPL必须在数值上小于或等于调用门的DPL

(上表中的CALL/JMP 检查规则的第一行)

C, 如果针对调用过程和调用门之间的特权级检查成功,则处理器检查代码段描述符的DPL 与调用过程的CPL,对指令CALLJMP的特权级检查规则也有所不同,只有指令CALL能够使用调用门来控制程序转换到较高特权级的非一致性代码段。也就是说,非一致性代码段的DPL小于CPL指令JMP能够使用一个调用门控制程序转换到DPLCPL相等的非一致性代码段。这两条指令都能够控制程序转换到较高特权级的一致性代码段,即一致性代码段的DPL在数值上小于或等于CPL

如果调用具有较高特权级的非一致性目标代码段,那么,CPL的级别被改变为目标代码段的DPL,发生堆栈切换。如果调用或跳转到具有较高特权级的一致性目标代码段,那么, CPL不变,也不会发生堆栈的切换。

实际例子:

位于一个代码段中的一些操作系统服务程序,这些服务程序应能被操作系统和应用软件所使用。为这些过程建立调用门的特权级DPL调用门)3,使所有特权级(0-3)的调用门都能访问这些过程。然后,就可为操作系统其他服务程序建立较高特权级的调用门(DPL01),这些服务程序只能为操作系统所使用,如初始化设备驱动器的过程,这在开发硬件时是已经设计好的。由此可见,调用门更象一个管理严格的门卫,管理和控制欲使用它的申请者的特权级(RPL)和派出申请者的机构本身的特权级(CPL),把它们的级别同调用的本身的级别(DPL)进行比较按照上述规则进行管理,既保证了操作系统的某些重要子程序能被一般用户调用又保护了操作系统的不能被一般用户使用的程序或数据。

 

概念解释:一致的代码段

答:重要的是 “原来代码的特权级无须更改”。

最简单的段间转移使用JMPCALLRET指令把控制权转移到任务中相同特权级代码段中。这种转移是通过让新CS选择符指定内存中存在的一个具有DPL=CPL的可执行代码段,或者具有DPL<=CPL的一致性代码段来实现。

一致性执行段是一种特殊类型的内存段,用于支持运行在多个不同特权级中的程序共享函数,而无须改变代码的特权级。例如,通过把数学库函数放在一个一致性代码段中,该函数库就可以被运行在不同特权级上的程序共享。此时运行在任何级别上的程序就可以使用段间调用方式调用库中的函数,并且该函数将在调用者特权级层次上运行。

转移到一致性段的控制转移将在调用者特权级上运行一致性段中的代码,而不是在一致性段的DPL级上运行。然而一致性段的DPL会用于指定能够转移到一致性段的最高特权级级别DPL的这种含义正好与DPL的普通含义相反。通常,DPL用于指定允许访问一个段的最低特权级,而一致性代码段却使用DPL来指定允许转移到本段的最高级别。这意味着处于特权级3的程序可以转移到任何一致性代码段去,但是处于特权级0的函数却只能转移到具有DPL=0的一致性代码段。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值