当前位置: 首页 > 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…...

Python:操作 Excel 折叠

💖亲爱的技术爱好者们,热烈欢迎来到 Kant2048 的博客!我是 Thomas Kant,很开心能在CSDN上与你们相遇~💖 本博客的精华专栏: 【自动化测试】 【测试经验】 【人工智能】 【Python】 Python 操作 Excel 系列 读取单元格数据按行写入设置行高和列宽自动调整行高和列宽水平…...

学校招生小程序源码介绍

基于ThinkPHPFastAdminUniApp开发的学校招生小程序源码&#xff0c;专为学校招生场景量身打造&#xff0c;功能实用且操作便捷。 从技术架构来看&#xff0c;ThinkPHP提供稳定可靠的后台服务&#xff0c;FastAdmin加速开发流程&#xff0c;UniApp则保障小程序在多端有良好的兼…...

华为OD机试-食堂供餐-二分法

import java.util.Arrays; import java.util.Scanner;public class DemoTest3 {public static void main(String[] args) {Scanner in new Scanner(System.in);// 注意 hasNext 和 hasNextLine 的区别while (in.hasNextLine()) { // 注意 while 处理多个 caseint a in.nextIn…...

拉力测试cuda pytorch 把 4070显卡拉满

import torch import timedef stress_test_gpu(matrix_size16384, duration300):"""对GPU进行压力测试&#xff0c;通过持续的矩阵乘法来最大化GPU利用率参数:matrix_size: 矩阵维度大小&#xff0c;增大可提高计算复杂度duration: 测试持续时间&#xff08;秒&…...

Android15默认授权浮窗权限

我们经常有那种需求&#xff0c;客户需要定制的apk集成在ROM中&#xff0c;并且默认授予其【显示在其他应用的上层】权限&#xff0c;也就是我们常说的浮窗权限&#xff0c;那么我们就可以通过以下方法在wms、ams等系统服务的systemReady()方法中调用即可实现预置应用默认授权浮…...

服务器--宝塔命令

一、宝塔面板安装命令 ⚠️ 必须使用 root 用户 或 sudo 权限执行&#xff01; sudo su - 1. CentOS 系统&#xff1a; yum install -y wget && wget -O install.sh http://download.bt.cn/install/install_6.0.sh && sh install.sh2. Ubuntu / Debian 系统…...

return this;返回的是谁

一个审批系统的示例来演示责任链模式的实现。假设公司需要处理不同金额的采购申请&#xff0c;不同级别的经理有不同的审批权限&#xff1a; // 抽象处理者&#xff1a;审批者 abstract class Approver {protected Approver successor; // 下一个处理者// 设置下一个处理者pub…...

Java编程之桥接模式

定义 桥接模式&#xff08;Bridge Pattern&#xff09;属于结构型设计模式&#xff0c;它的核心意图是将抽象部分与实现部分分离&#xff0c;使它们可以独立地变化。这种模式通过组合关系来替代继承关系&#xff0c;从而降低了抽象和实现这两个可变维度之间的耦合度。 用例子…...

脑机新手指南(七):OpenBCI_GUI:从环境搭建到数据可视化(上)

一、OpenBCI_GUI 项目概述 &#xff08;一&#xff09;项目背景与目标 OpenBCI 是一个开源的脑电信号采集硬件平台&#xff0c;其配套的 OpenBCI_GUI 则是专为该硬件设计的图形化界面工具。对于研究人员、开发者和学生而言&#xff0c;首次接触 OpenBCI 设备时&#xff0c;往…...

华为OD机试-最短木板长度-二分法(A卷,100分)

此题是一个最大化最小值的典型例题&#xff0c; 因为搜索范围是有界的&#xff0c;上界最大木板长度补充的全部木料长度&#xff0c;下界最小木板长度&#xff1b; 即left0,right10^6; 我们可以设置一个候选值x(mid)&#xff0c;将木板的长度全部都补充到x&#xff0c;如果成功…...