不同特权级间代码段的跳转{ 门 + 跳转(jmp + call) + 返回(ret) }

【0】写在前面

  • 0.1)我们讲 CPU的保护机制,它是可靠的多任务运行环境所必须的;
  • 0.2) CPU保护机制:分为段级保护 + 页级保护;
    • 0.2.1)段级保护分为:段限长 limit 检查、段类型 type 检查、特权级检查、等等……
  • 0.3)我们着重讲 段特权级检查(bit 6~5): 特权级检查又分为:访问数据段时的特权级检查 + 代码段之间转移控制时的特权级检查;(这里,我们着重讲 代码段间转移控制时的特权级检查)
  • 0.4)版权声明:本文部分内容图片总结于李炯的“Linux内核完全剖析“;

【1】进入代码段间转移控制时的特权级检查(引入门的概念)
1.0)使用jmp 或 call 指令可以实现以下4 种转移:

  • 1)目标操作数包含目标代码段的段选择子;
  • 2)目标操作数指向一个包含目标代码段选择子的调用门描述符;
  • 3)目标操作数指向一个包含目标代码段选择子的TSS;
  • 3)目标操作数指向一个任务门, 这个任务门指向一个包含目标代码段选择子的TSS;

1.1)直接调用或跳转到代码段
(Attention): JMP、CALl 和 RET指令的近转移只是在当前代码段中执行程序控制转移,因此不会执行特权级检查;JMP、CALL和 RET 指令的远转移 会把 控制转移到 另一个代码段中,因此处理器会进行特权级检查;

  • 1.1.1)当不通过调用门把程序控制权转移到另一个代码段时,处理器会验证4种特权级和类型信息:
  • (验证?如何验证? 拿 CPL和 选择子中的RPL 去和目的段描述符中的DPL 进行比较,验证)
    • 1. 当前特权级 CPL;
    • 2. 含有被调用过程的目的代码段描述符中的描述符特权级 DPL;
    • 3. 目的代码段的段选择子中的请求特权级 RPL;
    • 4. 目的代码段描述符中的一致性标记 C, 它确定了一个 代码段是非一致代码段(C=0)还是 一致代码段(C=1);

1.1.2)如何验证?-Validation

  • V1)当访问非一致代码段(C=0):CPL 必须等于 目标代码段的DPL, 同时要求 RPL 小于 DPL (即RPL的特权级大于DPL),才能使得转移成功;
    当非一致代码段的段选择子 被加载进 CS寄存器中, 特权级字段不会改变,即它仍然是 调用者的CPL;
  • V2)当访问一致代码段时(C=1): 调用者的CPL 在数值上大于或等于目的代码段的 DPL (即DPL 的特权级要比 CPL大), 对于一致代码段的访问,处理器忽略对 RPL 的检查;
    当程序控制被转移到一个 一致代码段中, CPL并不改变, 即使目的代码段的DPL在数值上小于CPL;由于 CPL 没有改变, 因此堆栈也不会发生切换;

  • 最后, 大多数代码段都是非一致代码段, 对于非一致代码段, 程序的控制权只能转移到 具有 相同特权级的代码段中, 除非转移时通过一个调用门进行的;
    最后(这就是调用门存在的意义所在了,即调用门可以实现不同特权级间的非一致代码段的跳转)

1.2)门描述符
1.2.1)为了对具有不同特权级的代码段提供受控的访问,处理器提供了称为门描述符的特殊描述符集,有4种门描述符:

  • 1. 调用门(call gate), 类型TYPE=12: 用于在不同特权级间实现受控的程序控制转移;(访问调用门要求CPL和RPL,必须小于或等于调用门的DPL)(干货)
  • 2. 陷阱门(trap gate),类型TYPE=15:用于调用异常和中断的处理程序;
  • 3. 中断门(interrupt gate),类型TYPE=14:用于调用异常和中断的处理程序;
  • 4. 任务门(task gate),类型TYPE=5:用于任务切换;

1.2.2)调用门的功能:

  • 1. 指定要访问的代码段;
  • 2. 在指定代码段中定义程序的一个入口点;
  • 3. 指定访问过程的调用者需要具备的特权级;
  • 4. 若会发生堆栈切换, 它会指定在堆栈间需要复制的可选参数的个数;
  • 5. 指明调用门描述符是否有效;

    ; 门的定义,紧跟在描述符定义之后 
    ; 门                               目标选择子,偏移,DCount, 属性
    LABEL_CALL_GATE_TEST: Gate SelectorCodeDest,   0,     0, DA_386CGate+DA_DPL0 ;(8Ch + 00h)
    

    这里写图片描述
    这里写图片描述

1.3)通过调用门访问代码段

1.3.1) 当处理器访问调用门时, 它会使用调用门中的段选择符来定位目的代码段的段描述符。然后, CPU 会把代码段描述符的基地址与调用门中的偏移地址进行组合,形成代码段中指定程序入口点的线性地址(这里生成了线性地址,注意要和分页机制联系起来,如果开启分页机制的话)

    SelectorCallGateTest    equ LABEL_CALL_GATE_TEST    - LABEL_GDTLABEL_CALL_GATE_TEST: GateSelectorCodeDest,   0,     0, DA_386CGate+DA_DPL0 ;(8Ch + 00h)SelectorCodeDest    equ LABEL_DESC_CODE_DEST    - LABEL_GDT

这里写图片描述

1.3.2)通过调用门进行程序控制转移时, CPU会对4种 不同特权级进行检查;

  • 1. 当前特权级 CPL;(CS 和 SS 中的 bit1~0)
  • 2. 调用门选择子中的请求特权级RPL;(选择子数据结构 bit1~0)
  • 3. 调用门描述符中的描述符特权级 DPL;(段描述符数据结构,低4字节 bit6~5)
  • 4. 目标代码段描述符的 DPL;(同上)
  • 5. 目的代码段描述符中的一致性标志C 也要检查;(段描述符数据结构 的 bit10)

这里写图片描述
(Attention)访问调用门的条件:(干货)
为了访问调用门, 调用者程序的特权级CPL 必须小于或等于 调用门的 DPL, 而且门段选择子RPL 也必须小于或者等于调用门的DPL;


1.3.3)如何验证?-Validation(通过call 或 jmp 访问调用门的特权级检查)

  • V1)第一步,是检查调用者的特权级 与 调用门的特权级 是否符合特权级访问规则;
    这里写图片描述

  • V2)如果第一步成功, 则CPU 才会把 调用者的 CPL 与 调用门目的代码段的DPL特权级进行比较检查:

    • CALL指令):只有 CALL 指令 可以通过调用门把程序控制转移到特权级更高的非一致性代码段中,
    • JMP指令): JMP指令 只能通过调用门吧控制转移到 DPL == CPL 的非一致性代码段中;
    • CALL指令 + JMP指令): 这两条指令都可以把控制转移到 更高特权级的一致性代码段中,即转移到 DPL数值 小于或等于CPL的一致性代码段中;

1.3.4)转移之后,CPU都干了什么?

  • 1)目标代码段是更高特权级的非一致性代码段:如果一个调用吧控制转移到更高特权级的非一致性代码段中, 那么CPL 就会设置 成 目的代码段中的DPL值, 堆栈也会发生切换;
  • 2)目标代码段是更高特权级的一致性代码段:如果一个调用吧控制转移到更高特权级的一致性代码段中, 那么CPL 不会发生改变, 堆栈也不会发生切换;

1.4)调用门的作用

  • 1.4.1) 调用门可以让一个代码段中的过程 被不同特权级的程序访问, 例如,位于一个代码段中的os 代码可能含有os 自身和 应用软件都允许访问的代码,故 可以为这些代码设置一个所有特权级代码都能访问的调用门;
  • 1.4.2)另外,可以专门为仅用于os 的代码设置一些更高特权级的调用门;

【2】堆栈切换 + 从被调用过程返回

  • (如“转移之后,CPU都干了什么?”模块中提到: 如果一个调用吧控制转移到更高特权级的非一致性代码段中, 那么CPL 就会设置 成 目的代码段中的DPL值, 堆栈也会发生切换)

2.1)堆栈切换的目的:

  • 1)为了防止高特权级程序由于栈空间不足而引起崩溃;
  • 2)同时也为了防止低特权级程序通过共享的堆栈有意或无意地干扰高特权级的程序;

2.2)堆栈切换带来的问题:

  • 1)出现的问题: call 指令 执行前后的堆栈已经不再是同一个堆栈 了,那么我们在堆栈A中压入参数和返回地址, 需要出栈(ret or retf)时,堆栈却变成了堆栈B, 这该怎么办呢?
  • 2)解决方法: Intel提供一种机制, 将堆栈A的内容复制到 堆栈B中, 如下图;
    这里写图片描述

2.3)从被调用过程返回:
这里写图片描述

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

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

相关文章

精打细算油盐_Java:ChronicleMap第1部分,精打细算

精打细算油盐用数百万个对象填充HashMap会很快导致诸如内存使用效率低下,性能低下和垃圾回收等问题。 了解如何使用堆外CronicleMap ,其中可以包含数十亿个对象,而对堆的影响很小或没有。 当我们要使用中小型数据集时,内置的Map实…

日志服务器搭建及配置_[ELK入门到实践笔记] 一、通过rsyslog搭建集中日志服务器...

ELK 是elastic公司提供的一套完整的日志收集以及展示的解决方案,这是我在ELK学习和实践过程写下的笔记,整理成了一个ELK入门到实践的系列文章,分享出来与大家共勉。本文为该系列文章的第一篇,通过rsyslog搭建集中日志服务器&#…

JavaScript(JS)调用事件监听器(事件处理函数/事件处理程序/事件监听函数)时如何传递参数

<!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><title>事件的演示代码</title></head> <body> <input id"bt" type"button" value"test"> <scrip…

x86 的 TSS 任务切换机制

转自&#xff1a;http://blog.chinaunix.net/uid-587665-id-2732907.html 【0】写在前面segment descriptors 构建保护模式下的最基本、最根本的执行环境。system descriptors 则构建保护模式下的核心组件&#xff1a;&#xff11;、TSS descriptor 提供硬件级的进程切换机制&a…

spring安全性_具有PreAuthorize的Spring方法安全性

spring安全性朋友不允许朋友写用户身份验证。 厌倦了管理自己的用户&#xff1f; 立即尝试Okta的API和Java SDK。 数分钟之内即可在任何应用程序中对用户进行身份验证&#xff0c;管理和保护。 本教程将探讨使用Spring Security在Spring Boot中配置身份验证和授权的两种方法。…

animiz动画制作软件_AN动画制作软件

AN基础介绍我们先了解一些基本概念&#xff0c;才能帮助我们更好的进行下面一系列的操作。1.图层。图层就像是含有文字或图形等元素的胶片&#xff0c;一张张按顺序叠放在一起&#xff0c;组合起来形成页面的最终效果。图层可以将页面上的元素精确定位。图层中可以加入文本、图…

关于一致/非一致代码段与TSS 关系的个人看法

【0】概念定义 0.1&#xff09;一致代码段: 简单理解&#xff0c;就是操作系统拿出来被共享的代码段,可以被低特权级的用户直接调用访问的代码&#xff0c; 但是特权级高的程序不允许访问特权级低的数据. 通常这些共享代码&#xff0c;是”不访问”受保护的资源和某些类型异…

python预处理标准化_tensorflow预处理:数据标准化的几种方法

tensorflow预处理&#xff1a;数据标准化的几种方法发布时间&#xff1a;2018-08-09 19:39,浏览次数&#xff1a;1774, 标签&#xff1a;tensorflow数据归一化问题是数据挖掘中特征向量表达时的重要问题&#xff0c;当不同的特征成列在一起的时候&#xff0c;由于特征本身表达方…

三思笔记_使用反射前先三思

三思笔记介绍 有时&#xff0c;作为开发人员&#xff0c;您可能会遇到无法使用new运算符实例化对象的情况&#xff0c;因为其类名称存储在配置XML中的某个位置&#xff0c;或者您需要调用一个名称指定为注释属性的方法。 在这种情况下&#xff0c;您总会有一个答案&#xff1a;…

分页机制总结

【0】写在前面&#xff08;分页机制&#xff09; 0.0&#xff09; source code from orange’s implemention of a os and text description from Zhaojiong’s perfect analysis of Linux kernel and for complete code ,please visit https://github.com/pacosonTang/Orange…

python程序填空题参照代码模板、完善代码_python二级考试操作题11.pdf

综合应用题参照代码模板完善代码&#xff0c;实现下述功能。文件ngchina.html 保持了网页源代码&#xff0c;请将该页面中图片的URL 提取出来,并输出所有图像的URL。习题讲解#P301#读取HTML 文件内容def getHTMLlines(htmlpath):f open(htmlpath,"r",encoding utf-…

Struts2学习笔记

文章目录Struts2 的核心开发包Struts2 配置文件Struts2 域对象Struts2 编程流程Action 组件使用通配符配置 ActionAction 中如何访问 Session通过 ActionContext 对象访问 Session 对象&#xff08;不推荐&#xff09;通过实现 SessionAware 接口访问 sessionAction 如何访问 r…

如何从文件系统中读取文件内容

【0】写在前面 0.0&#xff09; text description from orange’s implemention of a os &#xff0c;文末总结系个人臆测出的干货 【1】intro to FAT12&#xff08;file allocation table 12&#xff09;文件系统格式&#xff08;from Baidu Baike&#xff09; &#xff08;…

java微服务,微在哪_Java:ChronicleMap第3部分,快速微服务

java微服务,微在哪标准Java Maps需要在启动时进行初始化。 了解如何利用可从文件初始化的ChronicleMaps并显着减少微服务启动时间&#xff0c;以及如何在JVM之间共享Maps。 内置的Map实现&#xff08;例如HashMap和ConcurrentHashMap速度很快&#xff0c;但是必须先使用映射进…

excel离散度图表怎么算_Excel数据分析——离散值排除-excel直方图

今天举例的数据继续沿用昨天做出来的结果&#xff0c;至于这组数据还要接着用多久~~可能要混到我讲不下去为止吧~~~我们通过两个不同的拟合公式得到了两组不同的残差值&#xff0c;数据情况如下&#xff1a;有没有觉得看上面那张散点图有点糊啊&#xff1f;没错&#xff0c;问题…

drools dmn_Drools DMN最新开源引擎性能改进

drools dmn我们一直在寻求改善Drools DMN开源引擎的性能。 我们最近审查了DMN用例&#xff0c;其中输入数据节点的实际输入总体有所不同。 这突出显示了引擎的次佳性能&#xff0c;我们在最新版本中对此进行了改进。 我想分享我们的发现&#xff01; 基准制定 当我们开始为此用…

制作FAT12软盘以查看软盘的根目录条目+文件属性+文件内容

【-1】Before for specific info , please visit http://wiki.osdev.org/Loopback_Device 【0】我们先上干货&#xff0c;看到效果后&#xff0c;我们再说明每个步骤的缘由&#xff1b; 【1】进入挂载目录&#xff0c;添加相关文件&#xff08;依个人意愿&#xff09; Attenti…

如何取消高亮显示重复项_如何将重复数据突出显示?

将表格中一列数据中重复的&#xff0c;使用特殊颜色突出显示或者使用一些符号标记出来。例如&#xff1a;一个供应商&#xff0c;可以邀请别的供应商加入成为联合体&#xff0c;报表要显示所有供应商&#xff0c;然后供应商最后一列显示所有联合体&#xff0c;当联合体供应商跟…

Maven的maven-source-plugin插件详解

maven-source-plugin 这个插件专门负责将项目源文件打成包的&#xff0c;该插件在 pom.xml 中的配置如下&#xff1a; <build><plugins><plugin><artifactId>maven-source-plugin</artifactId><version>3.0.1</version><configu…

Maven Java Web Project打包详解/如何打包

文章目录打包部署构件&#xff08;Artifacts&#xff09;打源码包方式一&#xff1a; 命令行方式方式二&#xff1a;使用 IDE将源码包发布到本地 Maven 仓库中涉及到案例项目的结构&#xff1a; 打包部署构件&#xff08;Artifacts&#xff09; war 格式的部署构件可以直接放…