(转载) 我对保护模式下CPL,DPL,RPL 的理解

来源:互联网 发布:spss数据分析软件安装 编辑:程序博客网 时间:2024/06/06 00:32

学过保护模式的人都知道,CPL,RPL,DPL是保护模式中很重要的几个概念.这些概念是理解保护模式的基础.
      每一段代码,在她诞生之后,就开始静静地等待着,等待着被执行.可能这就是她们存在的意义吧.某位先知曾经说过,没有被执行过的代码是悲哀的,没有崩溃过的程序是不完整的. 当某段代码开始被执行的时候,她的特权级别将会被设置在CS 寄存器的低两位,于是 她就开始执行, CPL - Current privilege level,顾名思义, 就是正在执行的代码所在段的特权级.这个时候,如果你要访问某段 东东(数据||代码||堆栈||?),在保护模式下,操作系统会检查下你的特权级别.这个时候就需要用到DPLRPL了, 所谓DPL 就是Descriptor Privilege Level,简单的说就是每个段的描述符里规定好的,你访问这个段需要的权限级别.而RPLRequest Privilege Level,这个就 比较有意思,顾名思义,它应该指的是,当你要访问某个段的时候,你实际上想使用的一种身份(权限).怎么说了,我们访问一个段的时候,都是通过一个16位的段选择子和32位的地址偏移来访问的,这个段选择子的高13位是一个索引,第2位是table 类型,就是放段描述符的一张表,每个段描述符就是一个8字节的东东.第0,1位就是表示RPL,那么,我们就可以设置RPL来表示我们请求以什么样 的权限来访问这个段.

        下面根据我们所要访问的段的类型不同分类讨论:
       1.目标段是堆栈段或数据段 在保护模式下,原则上是不允许低特权级的代码访问高特权级的数据段或堆栈段,也就是说要满足条件: CPL <= DPL && RPL <= DPL, 这个应该很好理解,例如DPL 为1, CPL 为0, PRL 为1,也就是说,虽然我有 0的特权级,但是我只以1(PRL)的特权级来访问目标段,在这里已经是足够的.当然如果CPL 为2,那么即使你宣称 要以0的特权级来访问也是被禁止的.
      2.目标段是代码段 我们再来看一下段描述符,段描述符中有一位用来表示该代码段是一致代码段还是不一致代码段.而段描述符是有几种类型的,比如代码段描述符,调用门描述符.理论上说,代码跳转有两种,一种是JMP(CALL)指令后直接跟的是代码段描述符,我们下面定义这种跳转为AJUMP/ACALL, 另一种是JMP(CALL)指令后跟的是调用门描述符,我们后面称之为BJUMP/BCALL当发生了一个代码跳转,操作系统会检查目标代码段的描述符,如果发现
         a.目标代码段是一致性代码段 游戏规则是,如果是AJUMP/ACALL 的跳转方式需要满足条件 CPL>=DPL,否则产生异常,跳转后的CPL将保持不变,如果采用的是 BJUMP/BCALL 的跳转方式需要满足条件 CPL==DPL && RPL <= CPL,因此跳转后CPL 也将保持不变.
         b.目标代码段是非一致性代码段 游戏规则是,如果是AJUMP/ACALL如果是AJUMP/ACALL 的跳转方式需要满足条件 CPL>=DPL,否则产生异常,跳转后的CPL将保持不 变,但是如果采用BJUMP/BCALL 的跳转方式需要满足条件CPL >= DPL,跳转后CPL被 置为DPL(这种情况有可能造成CPL提升). 简单的说,操作系统就是按照这些游戏规则来管理特权级的.乍一看,似乎RPL没什么用?既然存在,就必定有理由,当一段CPL为3的 代码跳转到DPL为1的代码段的时候,这个时候如果没有RPL,那么就可能导致这段代码通过执行DPL为1的代码的时候访问DPL为1的数据 段和堆栈段,所以在跳转的时候,操作系统可以将RPL设置为原先跳转前代码的特权级3,那么当跳转到DPL为1的代码段的时候,CPL为 1,RPL为3,仍然可以限制访问DPL为1的数据段,这样其实也就实现了对某些敏感数据段的保护.

原创粉丝点击