18-19-20 - 深入特权级转移

news2024/9/27 21:18:18

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

文章目录

  • 1. 初识任务状态段(TSS,Task State Segment)
    • 1.1 TSS中不同特权级的栈信息
    • 1.2 特权级转移时的栈变化
    • 1.3 问题一
    • 1.4 目标实验(操作系统雏形)
    • 1.5 编程实验(特权级转移综合实验)
    • 1.6 问题二
      • 1.6.1 RPL的意义
      • 1.6.2 引出问题
    • 1.7 小结
  • 2. 数据段的访问规则(数据段没有可执行属性)
    • 2.1 访问示例
    • 2.2 编程实验
    • 2.3 实验结论
  • 3. 代码段的规则
    • 3.1 代码段的分类
    • 3.2 代码段之间的跳转规则(不借助门描述符)
    • 3.3 编程实验:代码段的直接跳转规则
      • 3.3.1 非一致性代码段跳转
      • 3.3.2 一致性代码段的跳转
    • 3.4 实验结论
  • 4. 深入理解调用门
    • 4.1 关于调用门的注意事项
    • 4.2 编程实验:深入理解调用门
    • 4.3 小结

1. 初识任务状态段(TSS,Task State Segment)

  • 处理器所提供的 硬件数据结构,用于实现多任务解决方案
  • TSS 中保存了关键寄存器的值以及不同特权级使用的栈
    • 段寄存器
    • 通用寄存器
    • 不同特权级的栈信息

1.1 TSS中不同特权级的栈信息

  • 在TSS中只保存了3个栈信息
    • 特权级0:ss0、esp0
    • 特权级1:ss1、esp1
    • 特权级2:ss2、esp2

在这里插入图片描述

1.2 特权级转移时的栈变化

  • 特权级在变化时,需要用到不同特权级下的栈,当处理器进入不同的特权级时,它自动在TSS中找同特权级的栈。
  • 低特权级 ==> 高特权级(调用门
    • TSS 获取高特权级目标栈段
    • 将低特权级栈信息压入高特权级栈中(ss和esp)
  • 高特权级 ==> 低特权级(retf
    • 将低特权级栈信息从高特权级栈中取出并恢复到ss和esp

引用自《操作系统真象还原》:
  对于第1种——特权级由低变高的情况,由于不知道目标特权级对应的栈地址在哪里,所以要提前将目标栈的地址记录在某个地方,当处理器向高特权级转移时再从中取出来加载到SS和esp中以更新栈,这个保存的地方就是TSS,处理器会自动地从TSS中找到对应的高特权级栈地址。
  也就是说,除了调用返回外,处理器只能由低特权级向高特权级转移,TSS中所记录的栈是转移后的高特权级目标栈,所以它一定比当前使用的栈特权级要高,只用于向更高特权级转移时提供相应特权的栈地址。进一步说,TSS中不需要记录3特权级的栈,因为3特权级是最低的,没有更低的特权级会向它转移。
  不是每个任务都有4个栈,一个任务可拥有的栈的数量取决于当前特权级是否还有进一步提高的可能,即取决于它最低的特权级别。比如3特权级的程序,它是最低的特权级,还能提升三级,所以可额外拥有2、1、0特权级栈,用于将特权分别转移到2、1、0级时使用。2特权级的程序,还能提升两级,所以可额外拥有1、0特权级栈,用于将特权分别转移到1、0级时使用。以此类推,1特权级的程序,它可以额外拥有0特权级栈,0特权级已经是至高无上了,只有这一个0级栈。以上所说的低特权级转向高特权级的过程称为“向内层转移”,想想4个特权级划分的同心圆就知道了,高特权级位于里面。

  对于第2种——由高特权级返回到低特权级的情况,处理器是不需要在TSS中去寻找低特权级目标栈的。其中一个原因我猜您已经猜到了:TSS中只记录2、1、0特权级的栈,假如是从2特权级返回到3特权级,上哪去找3特权级的栈?另一方面的原因是低特权级栈的地址其实已经存在了,这是由处理器的向高特权级转移指令(call等)实现的机制决定的,换句话说,处理器知道从哪里找低特权级的目标栈。
  由于特权级向低转移后,处理器特权级有了变化,同样也需要将当前栈更新为低特权级的栈,它如何找到对应的低特权级栈呢?正常情况下,特权级由低向高转移在先,由高向低返回在后,即只有先向更高特权级转移,才能谈得上再从高特权级回到低特权级,否则没有“去”就谈不上“回”(宁可被骂啰嗦,我也要说清楚)。当处理器由低向高特权级转移时,它自动地把当时低特权级的栈地址(SS和ESP)压入了转移后的高特权级所在的栈中(随着以后深入学习大家会明白这一点),所以,当用返回指令如retf或iret从高特权级向低特权级返回时,处理器可以从当前使用的高特权级的栈中获取低特权级的栈段选择子及偏移量。由高特权级返回低特权级的过程称为“向外层转移”。

1.3 问题一

  • TSS中为什么 只保存3个特权级(0、1、2) 的栈信息?
  • 低特权级到高特权级会用,没有会升高到3的特权级。

1.4 目标实验(操作系统雏形)

低特权级 - 高特权级( 特权级转移 实验)

  1. 定义32位核心代码段和数据段(Privilege = 0):模拟内核态
  2. 定义32位任务代码段和数据段(Privilege = 3):模拟用户态
  3. 由核心代码段跳转到任务代码段执行(高 ==> 低,即 0 ==> 3,retf):模拟内核到应用程序
  4. 在任务代码段中调用高特权级代码段打印字符串(Call Gate):模拟应用程序陷入内核态

在这里插入图片描述

  • 注意事项
    • 特权级转移时会发生栈的变化(如何变化?)
    • 栈的变化需要在TSS结构体中预先定义
    • TSS结构体作为一个独立段定义(描述符,选择子)
    • 在核心代码段中加载具体的TSS结构体(ltr TSSSelector

1.5 编程实验(特权级转移综合实验)

【参看链接】:18-19-20 - 深入特权级转移 / 18 / 00

  • 从 0 到 3:

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

  • 模拟应用程序调用系统函数

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
放到显存段的时候,内核数据有可能会被破坏。

  • 修改gs显存段的特权级为3,正确代码如下:

在这里插入图片描述

【参看链接】:18-19-20 - 深入特权级转移 / 18 / 01

在这里插入图片描述

1.6 问题二

  • RPL究竟是什么?
  • 有什么用?

1.6.1 RPL的意义

  • 位置意义
    • 选择子或段寄存器的最低2位
  • 请求意义
    • 资源请求的特权级 (不同于当前特权级CPL)
    • 当需要请求获取某种资源时,处理器通过 CPL、RPL和DPL构成的一定的规则 来共同确定请求是否合法!

在这里插入图片描述

1.6.2 引出问题

  • 处理器通过什么规则判断 资源请求代码跳转 是否合法?

1.7 小结

  • TSS是通过调用门转移到高特权级执行的关键
  • TSS是处理器的硬件数据结构,用于实现多任务
  • TSS结构遵循保护模式下内存使用的规则
  • RPL在请求资源时是合法性判断的依据之一
  • 处理器使用CPL、RPL和DPL共同确定合法性

2. 数据段的访问规则(数据段没有可执行属性)

  • 访问者权限(CPL)高于等于 数据段权限(DPL)(数值上:CPL <= DPL)
  • 请求特权级(RPL)高于等于 数据段权限(DPL)(数值上:RPL <= DPL)

2.1 访问示例

  • CPL = 2,RPL = 1,DPL = 3,访问是否合法?
  • 合法
  • CPL = 0,RPL = 3,DPL = 2,访问是否合法?
  • 不合法
  • CPL = 0,RPL = 1,DPL = 2,访问是否合法?
  • 合法

2.2 编程实验

【参看链接】:18-19-20 - 深入特权级转移 / 19 / 00

2.3 实验结论

  • 选择子被段寄存器加载时,会进行保护模式的检查
    • 检查选择子的下标是否合法(段描述符的合法性)
    • 检查特权级是否合法(CPL和RPL的特权级要要高于数据段的特权级DPL)
    • 检查特权级时CPL和RPL之间是不比较的

3. 代码段的规则

3.1 代码段的分类

  • 系统段(S = 0)
    • LDT,TSS,各种门结构

在这里插入图片描述

  • 非系统段(S = 1)
    • 一致性代码段:X = 1,C = 1
    • 非一致性代码段:X = 1,C = 0

在这里插入图片描述

3.2 代码段之间的跳转规则(不借助门描述符)

  • 非一致性代码段
    • 代码段之间只能平级转移(数值上:CPL == DPL,RPL <= DPL)
  • 一致性代码段
    • 支持低特权级代码段向高特权级代码段的转移(数值上:CPL >= DPL)
    • 虽然可以成功转移高特权级代码段,但是当前特权级CPL不变

注意:

  • 数据段只有一种,没有一致性和非一致性的区分
  • 并且,数据段不允许被低特权级的代码段访问

3.3 编程实验:代码段的直接跳转规则

3.3.1 非一致性代码段跳转

  • 代码段之间只能平级转移(数值上:CPL == DPL,RPL <= DPL)

【参看链接】:18-19-20 - 深入特权级转移 / 19 / 01

在这里插入图片描述在这里插入图片描述
注:自己的理解:从code32跳到function执行,那么资源请求的特权级应该要高于等于之前的code32特权级。所以数值上function的RPL应该要小于等于code32的DPL。
在这里插入图片描述

3.3.2 一致性代码段的跳转

  • 支持低特权级代码段向高特权级代码段的转移(数值上:CPL >= DPL)

【参看链接】:18-19-20 - 深入特权级转移 / 19 / 02

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

  • 虽然可以成功转移高特权级代码段,但是当前特权级不变

【参看链接】:18-19-20 - 深入特权级转移 / 19 / 03

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
注:CPL没有发生改变,正是由于当前的特权级没有发生改变,栈没有发生改变,所以可以在NEW_SEGMENT中无缝调用PrintFunc。

3.4 实验结论

  • 特权级降低转移时,retf 指令会触发栈段的特权级检查
  • 一致性代码段可直接跳转到其它同级非一致性代码段执行:
    • 一致性代码段和非一致性代码段中的代码没有本质区别,这两种代码段仅仅是跳转时使用的合法性判断规则不同,因此,一致性代码段到非一致性代码段的直接同级跳转是合法的。
  • 小技巧
    • 大多数情况下,选择子中的RPL和对应段描述符中的DPL可设置为相同值。

4. 深入理解调用门

  • 调用门用于向高特权级的代码段转移(数值上:CPL >= DPL_object)
  • 调用门描述符的特权级低于当前特权级(数值上:CPL <= DPL_gate)

在这里插入图片描述

4.1 关于调用门的注意事项

  • 一:
    • 调用门支持特权级同级转移
    • 调用门同级转移被处理为普通函数调用或直接跳转
    • call通过调用门能提升特权级,jmp通过调用门只能同级转移
  • 二:
    • 通过调用门降特权级返回(retf)时:
      • 对目标代码段以及栈段进行特权级检查
      • 对相关段寄存器强制清零(指向高特权级数据的段寄存器)

4.2 编程实验:深入理解调用门

【参看链接】:18-19-20 - 深入特权级转移 / 20

在这里插入图片描述

思考:

  • 特权级由高至低返回后,为什么要把指向高特权级数据的段寄存器清零?
  • 因为内核安全。

4.3 小结

  • 调用门的使用(数值上):DPL_object <= CPL <= DPL_gate
  • 调用门支持同级跳转(jmp指令只能同级转移)
  • retf对栈的检查:CS.RPL == SS.RPL == SS.DPL
  • 特权级降低转移时,相关段寄存器的值将被清零

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

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

相关文章

QT系列第3节 QT中混合UI设计

QT开发过程中&#xff0c;经常使用Qt designer设计器和代码方式结合来及进行ui设计&#xff0c;本节将介绍这两种方式混合进行ui开发。 目录 1.工程添加图片资源 2.添加菜单 3.添加工具栏 4.简单文本编辑器实现 5. QT Creator常用快捷键 1.工程添加图片资源 &#xff08;…

javaee之MyBatis框架1

什么是MyBatis框架 先来说一下&#xff0c;什么是框架&#xff0c;框架就是不断升级的半成品软件 框架主要解决的问题&#xff1a;就是应用自身的设计与具体实现解耦&#xff0c;重点放到应用自身的设计上&#xff0c;而不是具体技术实现&#xff0c;具体的技术实现是由底层支…

【JVM知识】插入式注解处理器实现java编程规范检测

【JVM知识】插入式注解处理器实现java编程规范检测一、前言二、Java 规范提案三、注解分类四、java编译器五、插入式注解处理器六、代码规范检测实现&#xff08;代码示例&#xff09;七、项目版本统一控制实现&#xff08;代码示例&#xff09;一、前言 最近在看**《深入理解…

人人都能看懂的Spring原理,看完绝对不会懵逼

人人都能看懂的Spring原理&#xff0c;绝对不会懵逼为什么要使用Spring&#xff1f;Spring的核心组件Spring是如何实现IOC和DI的&#xff1f;定义了BeanDefinition扫描加载BeanDefinition根据BeanDefinition进行Bean的实例化和初始化实例化属性赋值保存到单例缓冲池一个Bean从创…

【Java开发】 Staffjoy 01 :项目目标及案例需求

Staffjoy 是 Spring Boot & Kubernetes 云原生微服务实践&#xff0c;是一个贴近生产的微服务云原生教学案例&#xff0c;本文依波波老师的课程。新开了一个坑&#xff0c;希望能搞懂微服务框架&#xff0c;感兴趣的同学也欢迎讨论~ 目录 1 Staffjoy 项目目标 2 Staffjoy…

【Java寒假打卡】Java基础-StringBuilder类

【Java寒假打卡】Java基础-StringBuilder类一、概述二、构造方法三、常用方法四、StringBuilder提高效率的原理五、StringBuilder实现字符串反转一、概述 也就是使用String 拼接字符串每一次都要开辟新的堆内存空间&#xff0c;使用StringBuilder不需要开辟新的内存空间 String…

软件架构设计的七大原则

学习设计原则是学习设计模式的基础。千万不能形成强迫症。当碰到业务复杂的场景时&#xff0c;需要随机应变。 在实际开发过程中&#xff0c;并不是一定要求所有代码都遵循设计原则&#xff0c;而是要在适当的场景遵循设计原则&#xff0c;就可以帮助开发者设计出更加优雅的代…

glibc内存管理那些事儿

Linux内存空间简介 32位Linux平台下进程虚拟地址空间分布如下图: 进程虚拟地址空间分布 图中&#xff0c;0xC0000000开始的最高1G空间是内核地址空间&#xff0c;剩下3G空间是用户态空间。用户态空间从上到下依次为stack栈(向下增长)、mmap(匿名文件映射区)、Heap堆(向上增长…

网络编程之IO多路复用

目录 一. 同步与阻塞 1.1 同步阻塞 1.2 同步非阻塞 1.3 异步阻塞 1.4 异步非阻塞 1.5 I/O多路 二.多路复用的技术 2.1 UNIX I/O Models 2.1.1 blocking I/O 2.1.2 nonblocking I/O 2.1.3 I/O Multiplexing Model 2.1.4 SIGIO 2.1.5 asynchronous I/O 2.2 IO多路复…

【拓扑排序】课程表问题

一、拓扑排序问题描述 给定&#xff1a;一系列任务 &#xff08;A&#xff0c;B&#xff0c;C …&#xff09; 任务间的依赖关系 (B 和 C 必须在 A 之前完成&#xff0c; …) 输出&#xff1a;这些任务间的合法执行顺序 &#xff08;C – B – A – …&#xff09; 总之&am…

「图文讲解」浏览器原理与页面渲染过程

相信大家在面试的时候面试官总是会问一个问题&#xff1a;“可以说下浏览器从输入url到渲染页面完成过程吗&#xff1f;”&#xff0c;非官方标准答案来啦&#xff5e; 那我们首先需要先来讲一下浏览器是什么&#xff0c;浏览器其实就是一个应用软件&#xff0c;在学习操作系统…

《数据结构、算法与应用C++语言描述》线性表-数组描述

《数据结构、算法与应用C语言描述》线性表-数组描述 5表示在 数据结构算法与应用C语言描述 书中所在章节。 本文包含了《数据结构、算法与应用C语言描述》第五章主要练习题答案&#xff0c;给出了线性表数组描述完整测试代码。 5.1 数据对象 5.1.1 定义 数据对象(data obj…

java开发的师生评教小程序学生对老师评价老师对班级评价打分题单选题意见框系统选课系统

简介 源码1.0&#xff08;源码2.0选课功能&#xff0c;请往下看&#xff09; 师生评教小程序&#xff0c;学生可以对老师进行评价&#xff0c;老师可以对班级行进评级。管理员可以创建不同的评教模板&#xff08;单选题0分或者10分&#xff0c;打分题0-10分&#xff0c;意见框…

三分钟彻底搞懂paint,repaint,update!

最近总结了一下java中的paint&#xff0c;repaint和updata三者之间的关系&#xff0c;首先咱们都知道用paint方法来绘图&#xff0c;用repaint重绘&#xff0c;用update来写双缓冲。但是他们之间是怎么来调用的呢&#xff0c;咱们来分析一下(想直接看结果&#xff0c;请跳过分析…

2022卡塔尔世界杯感想

一、概述 说说我个人吧&#xff01;在体育活动上面真是没什么兴趣&#xff0c;篮球&#xff0c;足球...等等竞技运动不敏感&#xff01; 今年稍微关注了点世界杯比赛&#xff01;什么原因呢&#xff1f;我有一个爱买彩票/赌球的一个同事&#xff01;随着世界杯的进行&#xf…

风力发电机组机械功率Pm与转子转速Wm关系(Matlab实现)

目录 1 数学模型 2 代码 3 结果 1 数学模型 风力机空气动力学模型 风力涡轮机的动态输出机械扭矩表示为: 其中是空气密度 &#xff0c; A是叶片扫掠面积 &#xff0c; R是风力涡轮机的转子半径 (m)&#xff0c; 是风速 (m/s)。是叶片的功率系数&#xff0c;它是叶片桨距…

linux内网渗透:docker逃逸

Docker逃逸 前言 Docker 逃逸在渗透测试中面向的场景大概是这样&#xff0c;渗透拿到shell后&#xff0c;发现主机是docker环境&#xff0c;要进一步渗透&#xff0c;就必须逃逸到“直接宿主机”。甚至还有物理机运行虚拟机&#xff0c;虚拟机运行Docker容器的情况。那就还要…

基于VUE.JS的招聘系统

开发工具(eclipse/idea/vscode等)&#xff1a;idea 数据库(sqlite/mysql/sqlserver等)&#xff1a;mysql 功能模块(请用文字描述&#xff0c;至少200字)&#xff1a;本文是基于Vue.js对招聘系统的设计与实现&#xff0c;对招聘系统管理员、个人用户、企业用户三个模块功能的完善…

kubernetes学习之路--污点容忍度横向主节点

参考&#xff1a;K8s污点容忍度横向主节点-安全客 - 安全资讯平台 一.kube-scheduler调度 kube-scheduler是Kubernetes 集群的默认调度器&#xff0c;并且是集群控制面(master)的一部分。对每一个新创建的Pod或者是未被调度的Pod&#xff0c;kube-scheduler会选择一个最优的N…

[附源码]Nodejs计算机毕业设计基于图书管理系统Express(程序+LW)

该项目含有源码、文档、程序、数据库、配套开发软件、软件安装教程。欢迎交流 项目运行 环境配置&#xff1a; Node.js Vscode Mysql5.7 HBuilderXNavicat11VueExpress。 项目技术&#xff1a; Express框架 Node.js Vue 等等组成&#xff0c;B/S模式 Vscode管理前后端分…