原来看第3.2.3节的时候,感觉很难的。为什么会感觉难呢? 因为这一节谈到的特权级别关系比较复杂,不容易弄清楚。这次重看一次这一节后,进行了一点小结,这才感觉比较清楚了。
      这一节的主要内容可以用下面这个表格来描述。

目标代码段

Jmp指令

Call指令

直接调用

通过调用门

一致码段

CPL>=DPL,不检查RPL

可以跳转到相同或者更高特权级别执行

CPL<=DPL_G,RPL<=DPL_G

CPL>=DPL

访问调用门的规则同访问数据段,即调用门只能被特权级别不低于其DPL(DPL_G)的代码访问。可以跳转到相同或者更高特权级别执行。

非一致码段

RPL<=CPL=DPL

只能跳转到同特权级别的代码段

1.  三种特权级别

CPL:当前特权级别。当前正在运行的代码所处的特权级别,保存在CS和SS的低2位中。

DPL:描述符特权级别,即段描述符中DPL字段的值,是与描述符相关的特权级别。

RPL:请求特权级别,即用于访问代码、数据或者堆栈的段选择子低2位的值。

注意特权级别的表示:有0至3这4个特权级别,0级最高,3级最低,即数字大则特权级别低。表中CPL、RPL、DPL等都是代表数字的。

2. 一致码段和非一致码段

(1)一致码段:无论采用哪种方式跳转到一致码段,CPL都不改变(不变化为目标代码段的DPL),也即在加载目标代码段选择子时,只加载高14位,表示CPL的低2位保持不变。

(2)非一致码段:无论采用哪种方式跳转到非一致码段,CPL都发生改变,也即在加载目标代码段选择子时,将整个选择子放入到CS中。

“一致”的意思就是:代码段被调用执行时不使用自己的描述符的DPL,而采用调用者特权级别,CS的低2位保持不变,与调用者特权级别保持一致。

是不是一致码段由描述符中的相应位标志确定(参看47到49页的表格)。

3. Jmp与Call

Jmp指令仅仅进行执行流程的跳转,不会保存返回地址。

Call指令在进行流程跳转前会保存返回地址,以便在跳转目标代码中可以使用ret指令返回到call指令的下一条指令处继续执行。执行段内跳转时,只保存EIP;如果是段间跳转,还保存CS。

对于使用Call指令(无论是直接调用还是通过调用门)进行的跳转,如果跳转后特权级别将发生改变(总是从低到高,从上述第2点知道,只有跳转到非一致码段时才会发生特权级别变化),则执行call指令前必须准备好任务状态段TSS。跳转过程是:(1)保存调用者的SS和ESP到被调用者堆栈中(2)调用参数先保存在调用者堆栈中,然后被复制到被调用者堆栈中(3)当前CS和EIP被保存到被调用者堆栈中。在通过call进行的有特权级别变化的跳转中,堆栈会发生切换,这时要保存当前堆栈指针(SS:ESP),而当前指令指针(CS:EIP)保存到新的堆栈(被调用者堆栈)中,这是与没有特权级别变化的跳转不同的。没有特权级别变化时,不需要保存SS:ESP,不存在调用参数的复制,不存在堆栈切换。

4. ret和retf

这两个指令的功能都是调用返回。

(1) ret在返回时只从堆栈中取得EIP;retf中的字母f表示far,即段间转移返回,要从堆栈中取得EIP和CS。

(2)两个指令都可以带参数,表示发生过程调用时参数的个数,返回时需要从堆栈中退出相应个数的参数

(3)恢复CS时,如果发现将发生特权级别变化(当前CS的低2位不等于从堆栈中取得的新的CS值的低2位。从上述第2点知道,只有跳转到非一致码段时才会发生特权级别变化,那么,也只有从非一致码段返回时才会发生特权级别返回),则还要从调用者堆栈中取得ESP和SS恢复到相应寄存器中,也即恢复调用者堆栈。

5. 任务状态段TSS

为避免相互干扰,要求不同特权级别的代码运行时使用不同的堆栈,也就是在特权级别发生改变时必须切换堆栈段。0、1、2特权级别的堆栈指针保存在TSS中,在跳转到相应级别时从TSS中取出相应的堆栈指针进行堆栈切换。因为只有从低特权级别跳转到高特权级别时才需要从TSS中取得新的堆栈指针,所以TSS中不存在最低特权级别3的堆栈指针。

综上所述,所有的复杂只有一点:仅仅在通过调用门从低特权级别跳转到高特权级别的非一致码段时,才会发生CPL改变,才需要先准备好TSS,才会发生堆栈切换(在调用前从TSS中取得新的堆栈指针;调用返回时从被调用者堆栈中取得原堆栈指针进行恢复)。

CPL、RPL、DPL的区别

CPL(Current   Privilege   Level) 当前(代码)特权级。在保护模式下,CS寄存器、SS寄存器中分别存放着代码段、堆栈段的选择子。CPL在CS、SS的第0、1位(第0位到15位)中。CPL一般情下等于所装载的段的特权级。对于一致代码段来说,CPL不会随着所装载的段的特权级而改变。

DPL(Descriptor   Privilege   Level) 描述符特权级,在每个存储段(数据段、代码段、堆栈段)描述符、门(调用门、任务门、中断门、陷阱门)描述符、任务状态段(TSS)描述符的第5个字节(第0字节到第7字节)的第5、6位(第0位到第7位)中。DPL主要用来与CPL比较,来确定当前代码是否能够访问相应的段。

RPL(Request   Privilege   Level) 选择子特权级,在每个选择子的第0、1位(第0位到15位)中。RPL主要用来改写CPL,当进行段访问的时候,取CPL和RPL中数值大的一个(即取权限小的一个)。如:CPL为0,要访问的调用门DPL为2,但是选择子的RPL为3,此时不可以访问调用门。

3.2.3节:特权级相关推荐

  1. 操作系统真相还原_第5章第4节:特权级

    文章目录 特权级 TSS简介 CPL和DPL入门 处理器提供的从低特权级到高特权级的方法 门.调用门和RPL序 特权级 保护模式下特权级按照权力大小分为0.1.2.3级 0特权级是操作系统内核所在的的 ...

  2. 一步步编写操作系统 59 cpu的IO特权级1

    在保护模式下,处理器中的"阶级"不仅体现在数据和代码的访问,还体现在指令中. 一方面将指令分级的原因是,有些指令的执行对计算机有着严重的影响,它们只有在0特权级下被执行,因此被称为 ...

  3. 《Linux内核分析》 第四节 扒开系统调用的三层皮(上)

    <Linux内核分析> 第四节 扒开系统调用的三层皮(上) 张嘉琪 原创作品转载请注明出处 <Linux内核分析>MOOC课程http://mooc.study.163.com ...

  4. 【重识云原生】第二章计算第一节——计算虚拟化技术总述

    云平台计算领域知识地图: ​ 楔子:计算虚拟化技术算是云计算技术的擎天之柱,其前两代技术的演进一直引领着云计算的发展,即便到了云原生时代,其作用依然举足轻重. 一.计算虚拟化技术总述 1.1 虚拟化技 ...

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

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

  6. 第十六节,使用函数封装库tf.contrib.layers

    目录 一 tf.contrib.layers中的具体函数介绍 1.tf.contrib.layers.conv2d()函数的定义如下: 2.tf.contrib.layers.max_pool2d() ...

  7. 第五节 RabbitMQ在C#端的应用-消息收发

    原文:第五节 RabbitMQ在C#端的应用-消息收发 版权声明:未经本人同意,不得转载该文章,谢谢 https://blog.csdn.net/phocus1/article/details/873 ...

  8. 第2节 mapreduce深入学习:4, 5

    第2节 mapreduce深入学习:4.mapreduce的序列化以及自定义排序 序列化(Serialization)是指把结构化对象转化为字节流. 反序列化(Deserialization)是序列化 ...

  9. 光棍节程序员闯关秀(总共10关)

    程序员闯关大挑战: https://1111.segmentfault.com/ 仓鼠演示7k7k.4399小游戏: http://cdn.abowman.com/widgets/hamster/ha ...

最新文章

  1. 公司电脑安装操作系统遇到的一个坑
  2. Python可视化matplotlib绘制三维可视化图形(Three-Dimensional)
  3. SQL SERVER 2008 创建,删除,添加表的主键
  4. 兔子生崽问题编程_贵阳在哪里可以学到好的少儿编程
  5. Centos7安装MySQL(多图)
  6. You have new mail in /var/spool/mail/root消除提示的方法
  7. 中国内置自动咖啡机行业市场供需与战略研究报告
  8. 学习算法的网址【原创】
  9. ssh隧道(通过跳板机)连接mysql
  10. NLP学习—23.基于Transformer的机器翻译实战
  11. 最新emoji表情代码大全_在 Markdown 中使用表情符号
  12. 自动html5视频播放插件,视频自动转HTML5播放器插件
  13. 用grldr启动ISO
  14. one class SVM
  15. android短信验正则,Android实现短信验证码自动拦截读取功能
  16. myeclipse 6.5 注册码 myeclipse 6.0 注册码
  17. 关于git的使用(十五)------Rebase
  18. 万字长文,小学弟熬夜肝了这份腾讯面试攻略
  19. 中国书法列入非物质文化遗产
  20. python生成等差数列_python numpy函数中的linspace创建等差数列详解

热门文章

  1. 【Android 逆向】Android 逆向通用工具开发 ( Android 端远程命令工具 | Android 端可执行程序的 main 函数操作 | TCP 协议服务器建立 | 接收客户端数据 )
  2. 【Android 启动过程】Activity 启动源码分析 ( Activity -> AMS、主线程阶段 )
  3. 【错误记录】反射时调用方法及成员报错 ( 执行反射方法 | 设置反射的成员变量 | 设置方法/成员可见性 )
  4. 【计算机网络】计算机网络 OSI 参考模型 与 TCP/IP 参考模型 对比
  5. 【错误记录】GitHub 提交代码失败、获取代码失败、连接超时、权限错误、ping 请求连接超时 ( 查找域名对应 IP | 设置 host 文件 )
  6. 【Android RTMP】x264 图像数据编码 ( Camera 图像数据采集 | NV21 图像数据传到 Native 处理 | JNI 传输字节数组 | 局部引用变量处理 | 线程互斥 )
  7. 【Android RTMP】RTMPDumb 源码导入 Android Studio ( 交叉编译 | 配置 CMakeList.txt 构建脚本 )
  8. 【微信开发】微信开发 之 开启开发模式
  9. 团队软件开发第一次冲刺(四)
  10. Metail Design各个控件(二)