当前位置: 首页 > news >正文

《真象还原》读书笔记——第五章 保护模式进阶,向内核迈进(特权级,更新)

5.4 特权级深入浅出

5.4.1 特权级哪点事

计算机 访问 可分为访问者和被访问者。
建立特权机制为了通过特权来检查合法性。
0、1、2、3级,数字越小,权力越大。
0特权级是系统内核特权级。
用户程序是3特权级,被设计为“有需求就找操作系统”,所以不需要太大能力。

5.4.2 TSS 简介

Task State Segment 任务状态段。用于存储任务环境。104字节是TSS的最小尺寸,根据需要还可以接上个IO位图。

当任务在特权级变化的时候,如果说使用同一个栈来容纳所有特权级的数据,就会导致栈中数据混乱、栈溢出的问题。
所以TSS 中有3个栈。分别是:
ss0,sp0
ss1,sp1
ss2,sp2

TSS是处理器硬件原生的系统级数据结构。
特权级分为两类:

  1. 低特权到高特权级
    此时 3 可以到 2 1 0 ,2 可以到 1 0 ,1 可以到 0。这被称为“向内层转移”。
  2. 高特权级到低特权级。
    在处理器 从 低到高特权时,会自动地将低特权级的栈地址(SS 和 ESP)压入转移后的高特权级所在的栈中。在返回的时候,使用如retf / iret 从高到低的时候,处理器从当前高特权级的栈中将低特权级的栈段选择子和偏移量取回。 由高到低,过程被称为"向外层转移。

TSS 也是要加载的,由 TR 寄存器加载。每次执行不同任务时候,将TR寄存器加载不同的TSS就可以了。

5.4.3 CPL 和 DPL 入门

CPL 当前特权级
DPL 目标代码段的描述符上的特权级
RPL 请求特权级

处理器当前特权级的真实面目是什么?
在任意时刻,当前特权级CPL保存在CS选择子中的RPL部分。

当前特权级为什么会变化?
当处理器从一个特权级的代码段转移到另一个特权级的代码段上执行的时候。

访问者就是当前代码段中的指令。任何时候不允许访问比自己特权更高的资源。无论是数据还是代码,在不涉及RPL的情况下分情况讨论

  1. 受访者——数据段
    访问者特权级 >= 被访问资源特权级
  2. 受访者——代码段
    只能平级访问

既执行高特权级代码段上的指令,又不提升特权级,一方面是利用一致性代码段
1. 代码段是非一致性代码段,所以只能平级转移。
3. 一致性代码段(依从代码段)指如果自己是转移后的目标段,自己的特权级(DPL)一定要大于等于转移前的CPL。数值上 CPL >= DPL。一致性代码转移后的特权级不予自己的特权级(DPL)为主,而是与转移前的低特权级一致。

代码段:(比较为数值比较)
一致:CPL >= DPL:CPL 不变:低访问高
非一致:CPL == DPL:CPL 不变:平级访问

5.4.4 门、调用门 与 RPL 序

门结构就是记录一段程序起始地址的描述符。
描述符中有DPL。
任务门可以放在GDT、LDT、IDT中
调用门可以位于GDT、LDT中
中断和陷阱门只能在IDT中,不能主动调用,只能由中断信号触发。
都是来实现 低特权级转高特权级。

  1. 调用门
    call 、jmp
  2. 中断门
    int
  3. 陷阱门
    int3
  4. 任务门
    以任务状态段TSS为单位,用来任务切换。

实际上这些门都是有“门槛”的,就是 门描述符DPL
数值上:
当前特权级 CPL <= 门的DPL
当前特权级 CPL >= 门中目标代码段的DPL

在这里插入图片描述
调用门也是需要选择子的。既然门是指向某个内核例程,是例程就需要参数。
调用门如何在用户3特权级下位0特权级下的内核程序传递参数?
处理器的设计,在固件上实现了参数的复制,既将用户压在3特权级下的参数自动复制到0特权级的栈中。参数需在栈中按顺序挨着,处理器只需要知道有几个参数就好。

5.4.5 调用门的过程保护

调用门涉及2个特权级,CPL和门中目标代码的DPL。
用户进程通过call指令调用“调用门”过程。

  1. 在低特权级栈中压入参数。
  2. 处理器自动从TSS中找到高特权级的栈选择子SS和栈指针ESP。
  3. 检查新栈段描述符DPL和TYPE。
  4. 如果目标代码段的DPL 特权级高于 CPL。将ss_old和esp_old保存到其他地方,使用新栈。
  5. 将SS_old 和 ESP_old压入当前的高特权栈中。
  6. 将用户栈中参数复制到新栈。
  7. 段间远调用所以压入当前cs_old 和 eip_old。
  8. 将门中代码段选择子载入 CS,偏移量放入 EIP。

如果是平级处理,则不需要更新当前栈。
retf使用时:

  1. 先检查CS选择子中的RPL特权级检查.
  2. 获取CS_old 和 EIP_old并对 代码段的DPL 和 选择子中的RPL做特权级检查。如果通过,则从栈中弹出数据,eip_old到eip,CS_old到cs。
  3. 增加esp_new的值跳过栈中的参数。
  4. 如果第一步中改变了特权级,此时从栈中弹出esp_old和 ss_old。恢复旧栈。
    注意:返回的时候会检查数据段寄存器 DS、ES、FS、GS内容,如果其中选择子指向的数据段描述符DPL权限大于返回后的CPL,处理器会把数值0填充到相应的段寄存器中引发异常。

5.4.6 RPL的前世今生

在访问代码段的时候,是一个特权限制条件;
在访问数据段的时候,将CPL赋值给RPL 确定对数据操作的真实身份是用户还是操作系统。

要让受访问者清除真正请求资源的是用户还是系统。
在请求某特权级位DPL级别的 资源(数据) 的时候,参与检查的除了 CPL 还要加上 RPL。
数值上:
CPI <= DPL && RPL <= DPL
;
为了安全起见 操作系统会将RPL改为用户程序的CPL。
RPL引入是为了避免低特权级的程序访问高特权级的资源。

符合的样例如 0 <= 3 && 3 <= 3 当前为系统权限,之前是用户,对用户数据操作
或是 0 <= 3 && 0 <= 3 当前为系统权限,之前是系统,对用户数据操作
或是 0 <= 0 && 0 <= 0。当前为系统权限,之前是系统,对系统数据操作

特权级检查发生在什么时候?
在段寄存器中加载选择子访问描述符的时候。

不通过调用门直接访问数据和代码时的特权级检查规则
代码段

  • 目标非一致代码段
    数值上 CPLRPL目标代码段DPL
  • 一致性代码段
    数值上 CPL >= 目标代码段 DPL && RPL >= 目标代码段DPL。

数据段
数值上: CPL <= 目标数据段 DPL && RPL <= 目标数据段 DPL。
栈段
数值上:CPLRPL用作栈的目标数据段DPL。

对于门来说,处理器在检查特权级时:

  1. 要求CPL 和 RPL 在 DPL_GATE 和 DPL_CODE 之间
  2. (选择子上的)RPL 只在近调用门时 和 DPL_GATE 比较一次,然后 CPL 和 DPL_CODE 比较。
    数值上:DPL_GATE >= CPL >= DPL_CODE
    数值上:RPL <= DPL_GATE。

调用门使用 call 指令 和 jmp 指令。
jmp 只能平级

数值上:CPL == 目标代码段DPL
数值上:DPL_GATE >= CPL = =DPL_CODE && RPL <= DPL_GATE。

jmp就是被设计用于平级转移的。所以jmp 只用在不需要特权级变化,且不从调用门返回的场合。

相关文章:

《真象还原》读书笔记——第五章 保护模式进阶,向内核迈进(特权级,更新)

5.4 特权级深入浅出 5.4.1 特权级哪点事 计算机 访问 可分为访问者和被访问者。 建立特权机制为了通过特权来检查合法性。 0、1、2、3级&#xff0c;数字越小&#xff0c;权力越大。 0特权级是系统内核特权级。 用户程序是3特权级&#xff0c;被设计为“有需求就找操作系统”…...

艾德卡EDEKA EDI 需求分析

艾德卡Edeka 是德国最大的食品零售商&#xff0c;因其采用“指纹付款”的方式进行结算&#xff0c;成为德国超市付款方式改革的先驱。2022年8月&#xff0c;入选2022年《财富》世界500强排行榜&#xff0c;位列第256位。 艾德卡EDEKA EDI需求分析 传输协议 在传输协议层面&a…...

python如何使用最简单的方式将PDF转换成Word?

由于PDF的文件大多都是只读文件&#xff0c;有时候为了满足可以编辑的需要通常可以将PDF文件直接转换成Word文件进行操作。 看了网络上面的python转换PDF文件为Word的相关文章感觉都比较复杂&#xff0c;并且关于一些图表的使用还要进行特殊的处理。 本篇文章主要讲解关于如何…...

HashMap如何避免内存泄露问题

HashMap对于Java开发人员来说&#xff0c;应该是一种非常非常熟悉的数据结构了&#xff0c;应用场景相当广泛。 本文重点不在于介绍如何使用HashMap&#xff0c;而是关注在使用HashMap过程中&#xff0c;可能会导致内存泄露的情况&#xff0c;下面将以示例的形式展开具体介绍。…...

crontab -e定时任务

大家好&#xff0c;我是空空star&#xff0c;本篇带你了解下crontab -e定时任务。 文章目录前言一、crontab介绍二、crontab文件的含义四、crontab用法1.每隔5分钟执行一次命令2.每个小时的第5分执行一次命令3.每天9:05执行一次命令4.每隔9小时在第5分执行一次命令5.每月5号9号…...

JavaSE学习day7_01 面向对象

1. 类和对象 1.1 类和对象的理解 客观存在的事物皆为对象 &#xff0c;所以我们也常常说万物皆对象。即各个对象的总称&#xff0c;比如学生是一个类&#xff0c;但是学生有很多个&#xff0c;每一个称之为对象。 类 类的理解 类是对现实生活中一类具有共同属性和行为的事物的…...

有趣的HTML实例(十二) 早安、晚安动画(css+js)

这话在我心里已经复习了几千遍。我深恨发明不来一个新鲜飘忽的说法&#xff0c;只有我可以说只有你可以听&#xff0c;我说过&#xff0c;我听过&#xff0c;这说法就飞了&#xff0c;过去、现在和未来没有第二个男人好对第二个女人这样说。 ——《围城》 目录 一、前言 二、…...

入行测试已经4年了 ,进华为后迷茫了3个月,做完这个项目我决定离职....

转行测试 我是大专非计科&#xff0c;我转行之前从事的工作是商场管理&#xff0c;努力了4年左右的时间才做到楼层经理&#xff0c;但是工资太低并且事情太多&#xff0c;薪资才6K。 更多的是坚定了自己的想法&#xff0c;我要改变自己 恰好有几个大学同学在互联网公司工作&a…...

【halcon】灰度直方图直观理解与应用

灰度直方图 横坐标&#xff1a;是 0~255 表示灰度值的范围 纵坐标&#xff1a;是在不同灰度值下像素的个数&#xff01; 那么灰度直方图的本质就是统计不同灰度下像素的个数&#xff01; 它的直观目的&#xff0c;就是查看灰度的分布情况&#xff01; 与之相关的函数&#xff…...

Android笔记:动画

文章目录1.View Animation&#xff08;视图动画&#xff09;1.1 Tween Animation&#xff08;补间动画&#xff09;Animation 继承属性透明度alpha缩放scale移动translate旋转rotateset标签Animation父类共有函数1.2Frame Animation &#xff08;逐帧动画&#xff09;2.Propert…...

Git学习总结

目录 Git工作的基本流程图 git基本配置 配置SSH公钥 查看提交日志&#xff08;log&#xff09; 版本回退 为常用指令配置别名 添加文件至忽略列表 Git操作的基本指令 ​编辑 Git远程仓库的操作 把黑马的Git视频看完了黑马程序员Git全套教程&#xff0c;完整的git项目管…...

第四天笔记

1. 简述自定义转换器的使用过程&#xff1f; 第一步&#xff1a;定义一个类&#xff0c;实现 Converter 接口&#xff0c;该接口有两个泛型。 第二步&#xff1a;在 spring配置文件中配置类型转换器。  Spring配置类型转换器的机制是 将自定义的转换器注册到类型转换服务中去…...

《MySQL学习》 全局锁和表锁

一.MySQL锁的分类 二.全局锁 全局锁对整个数据库加锁&#xff0c;可以执行如下命令&#xff0c;整个数据库都将处于只读状态。 Flush tables with read lock ;我们可以执行 unlock table进行解锁 unlock table ;读操作 非读操作&#xff08;阻塞&#xff09; 全局锁的典型使…...

Altium Designer输出生产文件Gerber、IPC、NC Drill、坐标文件--AD

AD软件版本&#xff1a;22.2.1 gerber文件输出共有两部分&#xff1a; 1、Gerber Files:铜皮 和 外形分别导出 2、Nc Drill Files 分3次导出 一、Gerber Files 导出2次 设定原点 ** Edit->Origin->Set** 一般板边左下角为原点&#xff0c;可以根据自己板子形状确定 导…...

用VSCode搭建Vue.js开发环境及Vue.js第一个应用

目录 一、VSCode安装 二、VSCode简单配置 三、Vue.js的下载和引入 四、Vue.js第一个应用 一、VSCode安装 Visual Studio Code是一个轻量级但功能强大的源代码编辑器&#xff0c;可在您的桌面上运行&#xff0c;可用于Windows&#xff0c;macOS和Linux。它内置了对JavaScrip…...

Leetcode 每日一题 2341. 数组能形成多少数对

Halo&#xff0c;这里是Ppeua。平时主要更新C语言&#xff0c;C&#xff0c;数据结构算法......感兴趣就关注我吧&#xff01;你定不会失望。 &#x1f308;个人主页&#xff1a;主页链接 &#x1f308;算法专栏&#xff1a;专栏链接 我会一直往里填充内容哒&#xff01; &…...

前后端分离-小项目-3前后端交互

第一步编写前端页面&#xff0c;第二步搭建后端环境&#xff0c;现在开始第三步&#xff0c;继续完善前端功能完善“添加”按钮功能Ajax异步请求安装在前端项目安装ajax。在Terminal输入&#xff1a;npm i axios -S点击“添加”按钮&#xff0c;弹出Dialog对话框设置对话框里面…...

Spring如何整合MyBatis框架?使用XML及java类的配置方式

前言 Spring文章链接: 从头到尾Spring概念&#xff0c;家族&#xff0c;核心技术使用&#xff0c;事务这一篇就够了&#xff01;&#xff01;&#xff01;_千小半的博客-CSDN博客_spring最新技术 mybatis文章链接: MyBatis框架入门(含实例)_mybatis sqlsession创建和关闭_千小…...

第七届蓝桥杯省赛——8冰雹数(递归)

题目&#xff1a;任意给定一个正整数N&#xff0c;如果是偶数&#xff0c;执行&#xff1a; N / 2如果是奇数&#xff0c;执行&#xff1a; N * 3 1生成的新的数字再执行同样的动作&#xff0c;循环往复。通过观察发现&#xff0c;这个数字会一会儿上升到很高&#xff0c;一会…...

Android 10.0 设置静态ip重启后获取不到ip的修复

1.概述 在定制化开发中,对于设置静态ip以后可以正常使用,但是遇到一个新问题 就是开机以后,获取不到ip 地址,这就有点不正常了,获取不到ip 就自然连不上网了,所以要分析问题所在解决问题 2.设置静态ip重启后获取不到ip的修复的核心代码 frameworks/opt/net/ethernet/java…...

接口测试中缓存处理策略

在接口测试中&#xff0c;缓存处理策略是一个关键环节&#xff0c;直接影响测试结果的准确性和可靠性。合理的缓存处理策略能够确保测试环境的一致性&#xff0c;避免因缓存数据导致的测试偏差。以下是接口测试中常见的缓存处理策略及其详细说明&#xff1a; 一、缓存处理的核…...

React第五十七节 Router中RouterProvider使用详解及注意事项

前言 在 React Router v6.4 中&#xff0c;RouterProvider 是一个核心组件&#xff0c;用于提供基于数据路由&#xff08;data routers&#xff09;的新型路由方案。 它替代了传统的 <BrowserRouter>&#xff0c;支持更强大的数据加载和操作功能&#xff08;如 loader 和…...

边缘计算医疗风险自查APP开发方案

核心目标:在便携设备(智能手表/家用检测仪)部署轻量化疾病预测模型,实现低延迟、隐私安全的实时健康风险评估。 一、技术架构设计 #mermaid-svg-iuNaeeLK2YoFKfao {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg…...

前端导出带有合并单元格的列表

// 导出async function exportExcel(fileName "共识调整.xlsx") {// 所有数据const exportData await getAllMainData();// 表头内容let fitstTitleList [];const secondTitleList [];allColumns.value.forEach(column > {if (!column.children) {fitstTitleL…...

pam_env.so模块配置解析

在PAM&#xff08;Pluggable Authentication Modules&#xff09;配置中&#xff0c; /etc/pam.d/su 文件相关配置含义如下&#xff1a; 配置解析 auth required pam_env.so1. 字段分解 字段值说明模块类型auth认证类模块&#xff0c;负责验证用户身份&am…...

基于Uniapp开发HarmonyOS 5.0旅游应用技术实践

一、技术选型背景 1.跨平台优势 Uniapp采用Vue.js框架&#xff0c;支持"一次开发&#xff0c;多端部署"&#xff0c;可同步生成HarmonyOS、iOS、Android等多平台应用。 2.鸿蒙特性融合 HarmonyOS 5.0的分布式能力与原子化服务&#xff0c;为旅游应用带来&#xf…...

保姆级教程:在无网络无显卡的Windows电脑的vscode本地部署deepseek

文章目录 1 前言2 部署流程2.1 准备工作2.2 Ollama2.2.1 使用有网络的电脑下载Ollama2.2.2 安装Ollama&#xff08;有网络的电脑&#xff09;2.2.3 安装Ollama&#xff08;无网络的电脑&#xff09;2.2.4 安装验证2.2.5 修改大模型安装位置2.2.6 下载Deepseek模型 2.3 将deepse…...

聚六亚甲基单胍盐酸盐市场深度解析:现状、挑战与机遇

根据 QYResearch 发布的市场报告显示&#xff0c;全球市场规模预计在 2031 年达到 9848 万美元&#xff0c;2025 - 2031 年期间年复合增长率&#xff08;CAGR&#xff09;为 3.7%。在竞争格局上&#xff0c;市场集中度较高&#xff0c;2024 年全球前十强厂商占据约 74.0% 的市场…...

用 FFmpeg 实现 RTMP 推流直播

RTMP&#xff08;Real-Time Messaging Protocol&#xff09; 是直播行业中常用的传输协议。 一般来说&#xff0c;直播服务商会给你&#xff1a; ✅ 一个 RTMP 推流地址&#xff08;你推视频上去&#xff09; ✅ 一个 HLS 或 FLV 拉流地址&#xff08;观众观看用&#xff09;…...

Linux中INADDR_ANY详解

在Linux网络编程中&#xff0c;INADDR_ANY 是一个特殊的IPv4地址常量&#xff08;定义在 <netinet/in.h> 头文件中&#xff09;&#xff0c;用于表示绑定到所有可用网络接口的地址。它是服务器程序中的常见用法&#xff0c;允许套接字监听所有本地IP地址上的连接请求。 关…...