15-16-17 - 保护模式中的特权级

news2024/11/22 21:53:36

---- 整理自狄泰软件唐佐林老师课程

文章目录

  • 1. 保护模式小结
    • 1.1 使用选择子访问段描述符表时,索引值的合法性检测
    • 1.2 内存段类型合法性检测
    • 1.3 实例分析
  • 2. 问题一
  • 3. 保护模式中的特权级
    • 3.1 特权级的表现形式
    • 3.2 初探特权级
      • 3.2.1 CPL和DPL的关系
      • 3.2.2 段描述符中的DPL常量定义
    • 3.3 编程实验:保护模式特权级初探
  • 4. 问题二
    • 4.1 一种新的描述符:门描述符(Gate Descriptor)
    • 4.2 门描述符的内存结构
    • 4.3 调用门描述符(Call Gate)的定义
      • 4.3.1 调用门描述符的工作原理
      • 4.3.2 调用门描述符的使用
      • 4.3.3 汇编小贴士
      • 4.3.4 编程实验:初探调用门
    • 4.4 历史遗留问题
    • 4.5 编程实验:解决历史遗留问题
  • 5. 问题三
    • 5.1 调用门的特权级跳转分析
    • 5.2 再论函数调用的过程
    • 5.3 需要提前知道的事实
    • 5.4 解决方案(高特权级==>低特权级)
    • 5.5 编程实验:高特权级==>低特权级

1. 保护模式小结

1.1 使用选择子访问段描述符表时,索引值的合法性检测

  • 当索引值越界时,引发异常
  • 判断规则:索引值 * 8 + 7 ==> 段描述符表界限值
    在这里插入图片描述

在这里插入图片描述

1.2 内存段类型合法性检测

具备可执行属性的段(代码段)只能加载到 CS 寄存器
具备可写属性的段才能加载到 SS 寄存器
具备可读属性的段才能加载到 DS、ES、FS、GS 寄存器

  • 代码段和数据段的保护:
    • 处理器每访问一个地址都要 确认该地址 不超过界限值
    • 判断规则:
      • 代码段:IP(指令指针寄存器) + 指令长度 <= 代码段界限
      • 数据段:访问起始地址 + 访问数据长度 <= 数据段界限
  • 注意:
    • 保护模式中,在代码中定义的界限值通常为:相对于段基地址的 最大偏移地址值

1.3 实例分析

自行修改代码查看报错的信息进行学习。

【参看链接】:15-16-17 - 保护模式中的特权级 / 15

2. 问题一

  • 保护模式中除了利用 段界限 对内存访问进行保护,是否还提供其它的保护机制?

3. 保护模式中的特权级

  • x86架构中的保护模式提供了4个特权级( 0、1、2、3
  • 特权级从高到低分别是0、1、2、3(数字越大特权级越低)
    在这里插入图片描述

3.1 特权级的表现形式

  • CPL(Current Privilege Level)
    • 当前可执行代码段的特权级,由CS段寄存器 最低2位 定义
  • DPL(Descriptor Privilege Level)
    • 内存段的特权级,在段描述符表中定义
  • RPL(Request Privilege Level)
    • 选择子的特权级,由选择子最低2位定义

3.2 初探特权级

在这里插入图片描述

  • 段描述符中的DPL用于标识内存段的特权级,可执行代码访问内存段时必须满足一定特权级CPL,否则,处理器将产生异常。

3.2.1 CPL和DPL的关系

  • 保护模式中,每一个 代码段 都定义了一个 DPL
    • 当处理器从A代码段成功跳转到B代码段执行,不同代码段之间成功跳转后CPL可能发生改变:
      • 跳转前:CPL = DPL_A ==> 跳转后:CPL = DPL_B
  • 保护模式中,每一个 数据段 都定义了一个 DPL
    • 当处理器执行过程中需要访问数据段时:
      (CPL数值上小于等于数据段DPL才能成功访问数据,即:当前可执行代码段的特权级高于数据段的特权级,通俗来说,就是有权访问才能访问)

3.2.2 段描述符中的DPL常量定义

在这里插入图片描述

3.3 编程实验:保护模式特权级初探

  • 实验结论:
    • 处理器进入保护模式之后CPL=0(最高特权级)
    • 处理器不能直接从高特权级转换到低特权级执行
    • 选择子RPL大于对应段描述符的DPL时(RPL > DPL),产生异常
  • 引出的问题:
  • 如何在不同特权级的代码段之间跳转执行?
  • 高特权级代码为什么不能使用低特权级栈段?
  • 选择子的RPL具体有什么用?

4. 问题二

  • 如何在 不同特权级的代码段 之间跳转执行?

4.1 一种新的描述符:门描述符(Gate Descriptor)

门结构就是记录 一段程序 起始地址 的描述符

  • 通过 门描述符 在不同特权级的代码间进行跳转
  • 根据应用场景的不同,门描述符分为:
    • 调用门(Call Gate)
    • 中断门(Interrupt Gate)
    • 陷阱门(Trap Gate)
    • 任务门(Task Gate)

4.2 门描述符的内存结构

  • 每一个门描述符占用8字节内存
  • 不同类型门描述符的内存含义不同
    在这里插入图片描述

4.3 调用门描述符(Call Gate)的定义

在这里插入图片描述

4.3.1 调用门描述符的工作原理

在这里插入图片描述

4.3.2 调用门描述符的使用

在这里插入图片描述
在这里插入图片描述

4.3.3 汇编小贴士

  • 汇编语言中的跳转方式
    • 段内跳转:calljmp
      • 参数为 相对地址,函数调用时只需要保存当前偏移地址
    • 段间地址:call farjmp far
      • 参数为 选择子偏移地址
      • 函数调用时需要同时保存段基地址和偏移地址

4.3.4 编程实验:初探调用门

【参看链接】:15-16-17 - 保护模式中的特权级 / 16 / 00

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

  • 实验结论
    • 门描述符是一种特殊的描述符,需要注册于段描述符表中
    • 调用门可以看作一个 函数指针(保存具体函数的入口地址)
    • 通过调用门选择子对相应的函数进行调用(call far),对应的函数调用方式为 远调用
    • 可以直接使用 选择子 : 偏移地址 的方式调用其它段的函数
  • 使用调用门时 偏移地址无意义,仅仅是语法需要(为什么?)

4.4 历史遗留问题

  • 保护模式下的不同段之间如何进行代码复用(如:调用同一个函数)?
  • 解决方案:
    • 将不同代码段需要复用的函数定义到独立的段中(函数用retf 返回)
    • 计算每一个可复用函数的偏移量(FuncName - $$)
    • 通过 选择子 : 偏移地址 的方式对目标函数进行远调用

4.5 编程实验:解决历史遗留问题

https://gitee.com/wuxiang16/myos/blob/master/16/01/loader.asm

FUNCTION_DESC   :   Descriptor          0,      FunctionSegLen - 1,     DA_C + DA_32
FunctionSelector    equ     (0x0008 << 3) + SA_TIG + SA_RPL0
mov esi, FUNCTION_SEGMENT
mov edi, FUNCTION_DESC
call InitDescItem
call FunctionSelector : PrintString
PrintString     equ     PrintStringFunc - $$
FunctionSegLen  equ     $ - FUNCTION_SEGMENT

在这里插入图片描述

5. 问题三

  • 使用调用门如何实现 不同特权级 代码之间的跳转(如:从高特权级到低特权级)?
  • 不幸的事实
    • 调用门 只支持 从低特权级跳转到高特权级执行

5.1 调用门的特权级跳转分析

在这里插入图片描述

  • 思路整理:
    • 特权级跳转:
      • 通过 远调用(call far):低特权级 ==> 高特权级
      • 通过 远返回(retf):高特权级 ==> 低特权级
    • 远返回(retf)能够实现高特权级到低特权级的代码跳转,那么,考虑如何利用其机制完成这个跳转。

5.2 再论函数调用的过程

  • 近调用
    • 执行 ret 指令,相当于执行 pop eip
    • 调用func时eip被压入栈中,调用结束ret后,eip被重新取回到eip中

在这里插入图片描述

  • 远调用
    • 执行 retf 指令,相当于执行 pop eip,pop cs

在这里插入图片描述

5.3 需要提前知道的事实

  • x86处理器对于 不同的特权级 需要使用 不同的栈
  • 每一个特权级对应一个私有的栈(最多4个栈)
  • 特权级跳转变化之前 必须指定好相应的栈
  • 任务是由处理器执行的,任务在特权级变换时,本质上是处理器的当前特权级在变化,由一个特权级变成了另一个特权级。这就涉及到了栈的问题,处理器固定,处理器在不同特权级下,应该用不同特权级的栈,原因 是:
    1. 如果在同一个栈中容纳所有特权级的数据时,这种交叉引用会使栈变得混乱
    2. 用一个栈容纳多个特权级下的数据,栈容量有限,容易溢出

5.4 解决方案(高特权级==>低特权级)

  • 指定目标栈段选择子
  • 指定栈顶指针位置
  • 指定目标代码段选择子
  • 指定目标代码段偏移
  • retf 跳转

5.5 编程实验:高特权级==>低特权级

【参看链接】:15-16-17 - 保护模式中的特权级 / 17

  1. 默认code是0特权级,从0跳到3

在这里插入图片描述
在这里插入图片描述

retf之后,相当于pop eippop cs,即pop 0pop Code32Selector,此时栈顶指针esp指到了TopOfStack32。

在这里插入图片描述

  1. 如果都是0的话,这里就是用的同一个栈段,因此不需要指定栈段

在这里插入图片描述

结果是一样的:

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/91300.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

手把手教你Spring Cloud Alibaba教程:使用nacos实现服务注册与发现

我们在上一篇&#xff1a;手把手教你Spring Cloud Alibaba教程:nacos安装 接下来我们来实现下基本的服务注册和发现 版本确认 我们需要确认spring Cloud Alibaba version对应的nacso version 主要如下 版本说明 alibaba/spring-cloud-alibaba Wiki Spring Cloud Alibaba Ve…

图解:基于HyperWorks螺纹升角的六面体划分攻略

导读&#xff1a;在实际工程应用中&#xff0c;基于HyperWorks六面体工程命令&#xff0c;对工程师朋友来说比较繁琐&#xff0c;甚至不容易掌握。于是经常参加一些线下培训&#xff0c;用以提升自己业务技能。今天&#xff0c;笔者从一个企业资深培训讲师的角度&#xff0c;结…

Docker安装Oracle

Docker安装Oracle 本次使用的系统是centOS7 &#xff08;文章部分参考&#xff1a;地址&#xff09; 安装Docker docker安装要求&#xff1a;CentOS内核版本高于3.10&#xff0c;可以通过命令 uname -r查看当前内核版本 下载工具 yum install -y yum-utils设置阿里云镜像 …

【MySQL】使用C语言连接数据库

文章目录下载Mysql的C接口库程序中引入Mysql头文件和库文件**Mysql接口介绍**创建句柄链接数据库设置字符编码执行SQL语句关闭链接mysql.ops.cc下载Mysql的C接口库 要使用C语言连接mysql,需要使用mysql官网提供的库,大家可以官网下载,实际上连接数据库的功能在mysql 8.0版本之…

(十五)Vue之过滤器

文章目录计算属性实现methods实现过滤器实现局部过滤器不传参传参多个过滤器使用全局过滤器Vue学习目录 上一篇&#xff1a;&#xff08;十四&#xff09;Vue之收集表单数据 先看一个需求&#xff1a;给一个时间戳&#xff0c;然后把时间戳格式化显示出来 时间戳数据&#xf…

哈希表题目:相交链表

文章目录题目标题和出处难度题目描述要求示例数据范围进阶解法一思路和算法代码复杂度分析解法二思路和算法证明代码复杂度分析题目 标题和出处 标题&#xff1a;相交链表 出处&#xff1a;160. 相交链表 难度 2 级 题目描述 要求 给你两个单链表的头结点 headA\texttt…

web网页设计期末课程大作业 基于HTML+CSS仿苹果商城电商项目的设计与实现

常见网页设计作业题材有 个人、 美食、 公司、 学校、 旅游、 电商、 宠物、 电器、 茶叶、 家居、 酒店、 舞蹈、 动漫、 服装、 体育、 化妆品、 物流、 环保、 书籍、 婚纱、 游戏、 节日、 戒烟、 电影、 摄影、 文化、 家乡、 鲜花、 礼品、 汽车、 其他等网页设计题目, A…

Thread类和线程状态

目录 Thread 的常见构造方法 Thread 的几个常见属性 经典面试题&#xff1a;start和run的区别 interrupt 线程中断 join 线程等待 currentThread 获得当前这个线程对应的 Thread 对象的引用。 sleep 置顶休眠的时间(阻塞一会) sleep(1000)&#xff0c;真的只是休眠1000…

使用 MindStudio进行基于 MindX SDK 辅助驾驶项目的开发

视频链接&#xff1a;https://www.bilibili.com/video/BV1K8411p7Cm/ 1 任务介绍 ASSISTED-DRIVING的中文含义为辅助驾驶&#xff0c;其先采用了yolov3模型将图片中的交通标志检测出来&#xff0c;然后利用resnet18模型获对检测出来的交通标志进行分类&#xff1b;在道路线分…

0-1规划下的数独问题

数独显然是一个0-1规划问题.虽然这个什么凸分析还是啥的分析有这个优化的方法,但是,你DFS也不是完全一点不可能的对吧.嗯,既然这样的话,我们就要去解决这样一个更细致的问题了.数独这个问题他的解的存在性,唯一性怎么样.当然,已经有结论了,一个9*9的数独至少要给出17个值才能约…

Qt扫盲-QGridLayout理论总结

QGridLayout理论总结1. 简介2. 操作布局元素3. 常用属性4. 间隔设置1. 简介 QGridLayout 占用来自其父布局或 parentWidget()获得的空间&#xff0c;将其划分为行列表格形式&#xff0c;在每个布局的表格里放置控件或者布局器就行。 一般来说&#xff0c;列和行的行为功能相同…

Sourcetree安装详细步骤

前言&#xff1a; Sourxetree 作为 免费的 Git 客户端工具&#xff0c;有许多优点。Sourcetree 简化了与Git存储库交互的方式&#xff0c;因此我们可以专注于编码。通过 Sourcetree 简单又快捷的管理我们 的存储库。 下载安装包 进入 官网 选择Windows系统的安装包 &#xff…

【大数据技术Hadoop+Spark】HDFS Shell常用命令及HDFS Java API详解及实战(超详细 附源码)

需要源码请点赞关注收藏后评论区留言私信~~~ 一、HDFS的Shell介绍 Shell在计算机科学中俗称“壳”&#xff0c;是提供给使用者使用界面的进行与系统交互的软件&#xff0c;通过接收用户输入的命令执行相应的操作&#xff0c;Shell分为图形界面Shell和命令行式Shell。 文件系统…

PTC Creo Illustrate生产技术设备

PTC Creo Illustrate生产技术设备 Creo Illustrator是一款适用于生产技术设备的软件。该软件将三种功能与当前CAD设计数据、技术规范以及所需和可能使用的各种部件相结合。这些工具对供应商和客户尤其有用。供应商可以使用本文档中提供的信息熟悉机器。查看内部零件&#xff0c…

YOLO系列目标检测算法——YOLOR

YOLO系列目标检测算法目录 - 文章链接 YOLO系列目标检测算法总结对比- 文章链接 YOLOv1- 文章链接 YOLOv2- 文章链接 YOLOv3- 文章链接 YOLOv4- 文章链接 Scaled-YOLOv4- 文章链接 YOLOv5- 文章链接 YOLOv6- 文章链接 YOLOv7- 文章链接 PP-YOLO- 文章链接 …

喜讯 | 美格智能子公司美格智联成功获选2022年首批国家级“高新技术企业”认定

近日&#xff0c;全国高新技术企业认定管理工作领导小组办公室发布了关于对深圳市认定机构2022年认定的第一批高新技术企业进行备案公示的通知&#xff0c;根据《高新技术企业认定管理办法》&#xff08;国科发火〔2016〕32号&#xff09;和《高新技术企业认定管理工作指引》&a…

[C/C++/初学者]500以内的亲密数对(VS2012)

在开始编写程序之前&#xff0c;我们需要了解一个东西。 何为亲密数对&#xff1f; 简单来说&#xff0c;就是数a的正因子数&#xff08;除本身外&#xff09;等于数b的正因子数&#xff08;除本身外&#xff09;。 符合这项条件的两个数&#xff0c;我们称他们为亲密数对。 …

[附源码]Python计算机毕业设计高校体育馆管理信息系统Django(程序+LW)

该项目含有源码、文档、程序、数据库、配套开发软件、软件安装教程 项目运行 环境配置&#xff1a; Pychram社区版 python3.7.7 Mysql5.7 HBuilderXlist pipNavicat11Djangonodejs。 项目技术&#xff1a; django python Vue 等等组成&#xff0c;B/S模式 pychram管理等…

146.个性化推荐系统案例介绍

YouTube的推荐系统算法由两个神经网络组成&#xff1a; 一个用于候选生成一个用于排序 以用户的浏览历史为输入&#xff0c;候选生成网络可以显著减小可推荐的视频数量&#xff0c;从庞大的库中选出一组最相关的视频 这样生成的候选视频与用户的相关性最高&#xff0c;然后会对…

【ROS话题通信】发布者和订阅者

前言 本文记录ROS话题通信的学习过程&#xff0c;便于后续复习。首先明确&#xff0c;ROS中的话题通信&#xff0c;在ROS通信中非常重要&#xff0c;实现了分布式发布接收消息&#xff0c;也是实现了不同编程语言间的解耦&#xff0c;下面记录下自己学习过程中的相关代码和配置…