之所以出现这个定义是因为系统要安全:内核要和用户程序分开..内核一定要安全.不能被用户程序干涉.
但是有时候用户程序也需要读取内核的某些数据,怎么办呢?
操作系统就引入了访问特权等级(0-3)的机制.

这些特权等级,通过三个符号来体现CPL/DPL/RPL.

其中

CPL是存寄存器如CS中,

RPL是代码中根据不同段跳转而确定,以动态刷新CS里的CPL.

DPL是在GDT/LDT描述符表中,静态的。

1.在x86中的数据和代码是按段来存放的:[section],GTL/LDT里的每个段描述符被设置有不同的特权级DPL.
2.程序是通过选择子/门调用等等来在段之间来回走动的.实现用户级与系统级的调用跳转.
3.与GDT里的段描述符一样,CPU寄存器内的每一个选择子/门调用选择子是有分等级的:这个是在选择符的结构中:RPL(最后2位)

调用的选择符和被调用的段都分了等级.那么这些等级在调用时按什么规则实现跳转呢?

先来看看段描述符的相关定义.

段描述符总共有八字节,其中表示段属性的第五字节各位含义:

7  6 5  4  3...0

P  DPL S  TYPE

其中

P:为Persent存在位

1 表示段在内存中存在

0表示段在内存中不存在

DPL

Decsriptor Privilege level

段特权级.0-3

S

表示描述符的类型

1 数据段和代码段描述符

0 系统段描述符和门描述符

当 S=1 时TYPE中的4个二进制位情况:
     3       2       1       0
   执行位 一致位 读写位 访问位

执行位:置1时表示可执行,置0时表示不可执行;
一致位:置1时表示一致码段,置0时表示非一致码段;
读写位:置1时表示可读可写,置0时表示只读;
访问位:置1时表示已访问,置0时表示未访问。

所以一致代码段和非一致代码段的意思就是指这个一致位是否置1,置1就是一致代码段,置0就为非一致代码段。

一致代码段:

简单理解,就是操作系统拿出来被共享的代码段,可以被低特权级的用户直接调用访问的代码.

通常这些共享代码,是"不访问"受保护的资源和某些类型异常处理。比如一些数学计算函数库,为纯粹的数学运算计算,

被作为一致代码段.

一致代码段的限制作用

1.特权级高的程序不允许访问特权级低的数据:核心态不允许调用用户态的数据.
2.特权级低的程序可以访问到特权级高的数据.但是特权级不会改变:用户态还是用户态.

非一致代码段:

为了避免低特权级的访问而被操作系统保护起来的系统代码.

非一致代码段的限制作用

1.只允许同级间访问.
2.绝对禁止不同级访问:核心态不用用户态.用户态也不使用核心态.

通常低特权代码必须通过"门"来实现对高特权代码的访问和调用.

不同级别代码段之间转移规则,是通过CPL/RPL/DPL来校验.

如下先来理解这几个概念:

特权级
------------------------------------------------------------------------------------------

CPL是当前进程的权限级别(Current Privilege Level),是当前正在执行的代码所在的段的特权级,存在于cs寄存器的低两位。(个人认为可以看成是段描述符未加载入CS前,该段的DPL,加载入CS后就存入CS的低两位,所以叫做CPL,其值就等于原段DPL的值)

RPL说明的是进程对段访问的请求权限(Request Privilege Level),是对于段选择子而言的,每个段选择子有自己的RPL,它说明的是进程对段访问的请求权限,有点像函数参数。而且RPL对每个段来说不是固定的,两次访问同一段时的RPL可以不同。RPL可能会削弱CPL的作用,例如当前CPL=0的进程要访问一个数据段,它把段选择符中的RPL设为3,这样虽然它对该段仍然只有特权为3的访问权限。(个人认为是以CPL来访问段DPL所出示的“证件(RPL)”,如出示的“证件”权级范围在CPL之内且满足DPL的特权检查规则:DPL >= max{CPL,RPL},就能正常通过DPL;反之则不会通过还会发生错误)

DPL存储在段描述符中,规定访问该段的权限级别(Descriptor Privilege Level),每个段的DPL固定。当进程访问一个段时,需要进程特权级检查,一般要求DPL >= max {CPL, RPL}

下面打一个比方,中国官员分为6级国家主席1、总理2、省长3、市长4、县长5、乡长6,假设我是当前进程,级别总理(CPL=2),我去南城市(DPL=4)考察,用省长的级别(RPL=3 这样也能吓死他们:-))去访问,可以吧,如果用县长的级别,人家就不理咱了(你看看电视上的微服私访).

为什么采用RPL,是考虑到安全的问题,就好像你明明对一个文件用有写权限,为什么用只读打开它呢,还不是为了安全!

------------------------------------------------------------------------------------------

代码间跳转
------------------------------------------------------------------------------------------

普通转跳(没有经过Gate 这东西):即JMP或Call后跟着48位全指针(16位段选择子+32位地址偏移),且其中的段选择子指向代码段描述符,这样的跳转称为直接(普通)跳转。普通跳转不能使特权级发生跃迁,即不会引起CPL的变化,看下面的详细描述:

    目标是一致代码段:
     要求:CPL >= DPL ,RPL不检查。

转跳后程序的CPL = 转跳前程序的CPL
     
    目标是非一致代码段:
     要求:CPL = DPL AND   RPL<= DPL

转跳后程序的CPL = 转跳前程序的CPL

---------------------------------------------------------------------------------------

 通过调用门的跳转:当段间转移指令JMP和段间转移指令CALL后跟着的目标段选择子指向一个调用门描述符时,该跳转就是利用调用门的跳转。这时如果选择子后跟着32位的地址偏移,也不会被cpu使用,因为调用门描述符已经记录了目标代码的偏移。使用调门进行的跳转比普通跳转多一个步骤,即在访问调用门描述符时要将描述符当作一个数据段来检查访问权限,要求指示调用门的选择子的 RPL≤门描述符DPL,同时当前代码段CPL≤门描述符DPL,就如同访问数据段一样,要求访问数据段的程序的CPL≤待访问的数据段的DPL,同时选择子的RPL≤待访问的数据段或堆栈段的DPL。只有满足了以上条件,CPU才会进一步从调用门描述符中读取目标代码段的选择子和地址偏移,进行下一步的操作。

    从调用门中读取到目标代码的段选择子和地址偏移后,我们当前掌握的信息又回到了先前,和普通跳转站在了同一条起跑线上(普通跳转一开始就得到了目标代码的段选择子和地址偏移),有所不同的是,此时,CPU会将读到的目标代码段选择子中的RPL清0,即忽略了调用门中代码段选择子的RPL的作用。完成这一步后,CPU开始对当前程序的CPL,目标代码段选择子的RPL(事实上它被清0后总能满足要求)以及由目标代码选择子指示的目标代码段描述符中的DPL进行特权级检查,并根据情况进行跳转,具体情况如下:

    目标是一致代码段:
     要求:CPL >= DPL ,RPL不检查,因为RPL被清0,所以事实上永远满足RPL <= DPL,这一点与普通跳转一致,适用于JMP和CALL。
          转跳后程序的CPL = 转跳前程序的CPL,因此特权级没有发生跃迁。
                           

    目标是非一致代码段:

   当用JMP指令跳转时:
     要求:CPL = DPL (RPL被清0,不检查),若不满足要求则程序引起异常。
          转跳后程序的CPL = DPL
     因为前提是CPL=DPL,所以转跳后程序的CPL = DPL不会改变CPL的值,特权级也没有发生变化。如果访问时不满足前提CPL=DPL,则引发异常。

    当用CALL指令跳转时:

     要求:CPL >= DPL(RPL被清0,不检查),若不满足要求则程序引起异常。

          转跳后程序的CPL = DPL

     当条件CPL=DPL时,程序跳转后CPL=DPL,特权级不发生跃迁;当CPL>DPL时,程序跳转后CPL=DPL,特权级发生跃迁,这是我们当目前位置唯一见到的使程序当前执行优先级(CPL)发生变化的跳转方法,即用CALL指令+调用门方式跳转,且目标代码段是非一致代码段。

转自:http://blog.csdn.net/feijj2002_/article/details/4597174

DPL,RPL,CPL 之间的联系和区别相关推荐

  1. DPL RPL CPL区别与联系

    先说说他们的含义和存储的位置! PL:Privilege Level.特权级 CPL(Current):当前任务的特权级!内核态的时候,CPL = 0,用户态的时候,CPL = 3:linux中只用了 ...

  2. X86(IA32)段权限标志位CPL DPL RPL详解

    1.DPL,RPL,CPL 之间的联系和区别是什么?RPL和CPL是必须相同吗?如果相同,为什么要釆用两个而不改用一个呢? 答:特权级是保护模式下一个重要的概念,CPL,RPL和DPL是其中的核心概念 ...

  3. 详解 RPL、DPL、CPL 的关系

    保护模式中最重要的一个思想就是通过分级把代码隔离了起来,不同的代码在不同的级别,使大多数情况下都只和同级代码发生关系.Intel的80286以上的cpu可以识別4个特权级(或特权层) ,0级到3级.数 ...

  4. CPL DPL RPL的区别 一致性代码段和非一致性代码段

    概述:在谈论保护模式编程的时候,一直会有这样的困惑:为什么除了CPL和DPL还有RPL?什么时候高特权级不能访问低特权级?什么时候低特权级不能访问高特权级?一致性代码和非一致性代码有什么区别?等等这些 ...

  5. CPU段访问控制:特权级(RPL CPL DPL)和代码段一致性

      最近笔者回顾CPU硬件的段访问控制机制,重新看到了代码段一致性问题.虽然目前操作系统没有应用分段机制,但了解其运行原理仍然具有吸引力XD.本片文章,我们就来理清CPU段访问控制中,代码段一致性的概 ...

  6. Git、GitHub、GitLab三者之间的联系以及区别

    Git.GitHub.GitLab三者之间的联系以及区别 在讲区别以及联系之前先简要的介绍一下,这三者都是什么(本篇文章适合刚入门的新手,大佬请出门左转) 1.什么是 Git? Git 是一个版本控制 ...

  7. Java中Array和ArrayList之间的9个区别

    array和ArrayList都是Java中两个重要的数据结构,在Java程序中经常使用. 即使ArrayList在内部由数组支持,了解Java中的数组和ArrayList之间的差异对于成为一名优秀的 ...

  8. java map与set的区别_java 集合(list,set,map)三者之间的关系和区别

    原 java 集合(list,set,map)三者之间的关系和区别 一:先上一张关系图,让大家看的更明白. 备注:其中红色部分为实现,其他地方均为接口. 二:各自的特点. List 有序,可重复Arr ...

  9. spring揭秘_被问到了! Spring 和 Spring Boot 之间到底有啥区别?

    相信很多小伙伴和我一样,常用Spring 和Spring Boot 但是就是没有研究二者之间到底有什么区别? 今天就来大揭秘 ↓ 概述 对于 Spring和 SpringBoot到底有什么区别,我听到 ...

最新文章

  1. 基于TLD2331完成动态LED显示驱动
  2. Linux编辑器vi使用方法详细介绍
  3. java8 stream遍历_Java8新特性:Stream流详解
  4. 图像增强之对比度拉伸
  5. Prism安装、MVVM基础概念及一个简单的样例
  6. Leetcode题库 19.删除链表的倒数第N个结点(双指针法 C实现)
  7. 谷歌也被逼出局域网了 baidu从此天下无敌
  8. SQL server中DateTime类型字段如何赋值零?
  9. 使用Azure Blob存储托管Maven工件
  10. php使用pdo操作mysql数据库实例_php使用PDO操作MySQL数据库实例_PHP
  11. 解决IE6、IE7、IE8、Firefox兼容的两种方案
  12. unity3d利用pano2VR实现全景视图效果
  13. 基、维数和坐标 过渡矩阵与坐标变换
  14. java 类名_Java类的命名规则是什么
  15. 移动魔百盒CM201-2,YS代工-免拆机-直刷固件及教程
  16. IPSec IKEV2
  17. 【绘图】3D点图 及绘图关系matplotlib中plt系列
  18. 计算机插补,第三章计算机数控装置的插补原理.doc
  19. 书法拓片matlab,拓墨书法作品(拓片)的具体操作方法和步骤?
  20. 数字电路基础(二)逻辑代数

热门文章

  1. 【Linux】网络管理与相关应用
  2. 无锡室内设计培训:室内设计的程序是怎样的?
  3. 更稳定的手势识别方法-基于手部骨架与关键点检测
  4. Linux设备树led,linux设备树下LED灯控制
  5. TypeScript类的使用
  6. 我的世界java1.14刷铁机_我的世界1.14版刷铁机怎么做?
  7. 日语二级语法汇总(part11/16)
  8. C语言 生成集合的幂集
  9. css中background-size属性cover、contain、100%的含义案例详解
  10. Android7.0以上安装时出现“解析软件包错误”