4. 权限,特权
- 对数据段特权检查
- 对直接转移的代码段特权检查
- 栈段的检查
- 调用门的检查
权限问题:
- 由于CPL,DPL 无法完整表达权限的问题.
例如用户程序(CPL=3)通过调用门(将调用到内核过程,从低权限到高权限)执行,此时CPL=0,此时可以为所欲为. - 因此加入RPL.此参数由操作系统来保证,CPU仅使用
-
- RPL: 想以哪种权限去访问, 操作系统来填写, 一个自由的参数
-
- 描述符里的DPL=CPL=CS.RPL(16位中的低2位)
-
- DPL:访问此描述符的权限
对于数据段的特权检查:
从大方向说:只要权限比数据段大 ,或者相等就OK
实际根据以下几个步骤:
CPL:当前CS段的RPL, RPL:请求这个数据段的权限, DPL: 数据段的权限
-
- 根据CPL, RPL , DPL 这3个来检查
-
- CPL <= DPL && RPL <= DPL
假设有 数据段 DPL= 2:
| 代码段CPL=0 | 代码段CPL=1 | 代码段CPL=2 | 代码段CPL=3 |
|---|---|---|---|
| RPL=0 可访问 | RPL=1可访问 | RPL=2可访问 | RPL=3 不可访问 |
| RPL=1或2 可访问 | RPL=0 可访问 | RPL=1 可访问 | RPL=2 不可访问 |
| RPL=3 不可访问 | RPL=2可访问 | RPL=0可访问 | RPL=1不可访问 |
- 可以看到CPL=0的代码段,即使有最高权限,但如果RPL=3,也无法访问
- 至于CPL=3的代码段,无论如何都无法访问,毕竟CPL>DPL
对跳转或调用的代码段检查
这里特指 call far , jmp far
- jmp , call ,ret 这些都是段内的, 不需要重新加载cs , 因此不做检查
-
- 调用过程的CPL,RPL
-
- 转移到此处的目标描述符的DPL,C(是否是一致性代码段)
- 综上CPL,RPL,DPL,C 4项参与检查
- 又根据C 进行分别检查 if ( 1==C ){ 一致性代码段检查} else { 非一致性代码段检查}
如果C=0, 非一致性代码段的检查:
- CPL == DPL , 必须是相同特权级, 否则产生异常
- 由于只能是平级跳转,因此转移前后CPL不变
- 对于RPL: RPL<=CPL即可,毕竟RPL是一种希望用哪种方式(权限)去访问,RPL并不会影响CPL,RPL只用于检查
假设非一致性代码段的描述符:DPL=2,C=0
| 非一致性代码段描述符 | 代码段CPL=1 | 代码段CPL=2 | 代码段CPL=3 |
|---|---|---|---|
| 现有非一致性代码段的描述符:DPL=2,C=0 | CPL不一致,RPL=0~3都不可转移 | RPL=0~2都可以转移,RPL=3则无法转移 | CPL不一致,RPL=0~3都无法转移 |
| - | - | 成功转移后,CPL不变,RPL只用作检查,而非赋值 | - |
C=1, 一致性代码段检查(依从性)
- RPL不参与检查
- 满足: CPL>=DPL(一致性代码段), 也就是当前特权比目标代码段低或相等即可
- 一旦转移后, CPL不改变,依旧保持之前调用者的
假设一致性代码段的描述符:DPL=1,C=1
| 一致性代码段描述符 | 代码段CPL=1 | 代码段CPL=2 | 代码段CPL=3 | 代码段CPL=0 |
|---|---|---|---|---|
| 一致性代码段的描述符:DPL=1,C=1 | 可以访问 | 可以访问 | 可以访问 | 不可以访问 |
- RPL不参与检查,转移成功后CPL不改变
综上
- 对于代码段, 主要还是看CPL
- 对于数据段,需要RPL来辅助检查
栈段检查
- CPL=RPL=DPL
调用门检查
- 通过调用门可以执行一个高于本CPL的过程
- 调用门指向了某个代码段内的某一个过程
- 调用门本身也有DPL,想要使用调用门,调用者的CPL<=调用门DPL,也就需要达到使用调用门的权限
- 访问调用门可以使用 jmp far , call far
- 一旦访问了调用门,检查顺利后,根据调用门描述符内的 段选择子获取段描述符的基址 + 调用门内的偏移地址,就这个过程的线性地址
- 调用门就是一个描述符,格式:
| 31 ~ 16 | 15 | 14 ~ 13 | 12 | 11 ~ 8 | 7 ~ 5 | 4 ~ 0 |
|---|---|---|---|---|---|---|
| 段内偏移高16位 | P | DPL | 0 | TYPE(1100) | 000 | 参数个数 |
| 31 ~ 16 | 15 ~ 0 |
|---|---|
| 段选择子 | 段内偏移低16位 |
- 调用门需要4项检查:
- 当前调用者的CPL
- 调用门选择子RPL (操作系统 自己维护)
- 调用门描述符DPL
- 目标代码段描述符的DPL
- 检查2步:
-
- 首先要满足 本身能够访问调用门:CPL <= 门DPL, RPL <= 门DPL
-
- 下表格:
| 指令 | 一致性代码段 | 非一致性代码段 |
|---|---|---|
| call far | 代码段描述符DPL<=CPL | 代码段描述符DPL<=CPL |
| jmp far | 代码段描述符DPL<=CPL | 代码段描述符DPL=CPL |
| call far指令,栈切换 | CPl不发生变化,栈不切换 | CPL变成目标代码段的DPL,栈需要切换 |
| jmp far 指令,栈切换 | CPL不变,栈不切换 | 由于DPL=CPL,栈不切换 |
- 再一次的强调,权限无法从高到低
- 只有CPL变了,栈才会变,因此上面只有当call指令调用 非一致性代码段的时候, 才会切换栈, 除非CPL=DPL(例如CPL=0,目标代码段描述符的DPL=0)
- 综上:
- 对于一致性代码段: CPL>=目标代码段DPL, 不论JMP,CALL, 转移后CPL不变,栈不变
- 对于非一致性代码段:
-
- CALL指令要求: CPL >= 目标代码段DPL , CPL变成目标代码段DPL, 切换栈(除非CPL=DPL,那么栈不变)
-
- JMP 指令: CPL = 目标代码段DPL , CPL不变,栈不变
- 看上去内容有点多,需要到处判断,一会门检查,一会代码段DPL检查,还要考虑栈切换的问题
- 实际没那么麻烦,也就2条需要注意的
-
- 一个是有权限访问门 ,也就是本身权限至少要与门相等 数值上: CPL <= 门DPL, RPL <=门DPL
-
- 调用者代码段的权限,要低于代码段或相等,也就是低权限到高权限,那么数值上: CPL>= 目标代码段DPL
- 至于jmp 和 call 的区别不用记, 让CPU产生保护性异常(GP)告诉我们即可,一旦产生异常说明此处jmp 指令有问题了( CPL != DPL)
- 对于栈的问题,一句话就解决,CPL一变, 栈跟着变 ; CPL不变,栈也不变
调用门的首次检查例子:
| 门描述符 | 代码段A | 代码段B | 代码段C | 代码段D | - |
|---|---|---|---|---|---|
| 门DPL=3 | CPL=3 | CPL=2 | CPL=1 | CPL=0 | 代码段A,B,C,D任意+RPL=0~3都可以访问 |
| 门DPL=2 | CPL=3,RPL=0~3都无法访问 | CPL=2,RPL=0~2可以访问,RPL=3无法访问 | CPL=1,RPL=0~2可以访问,RPL=3无法访问 | CPL=0,RPL=0~2可以访问,RPL=3无法访问 | A的CPL权限不足以访问门DPL;B,C,D的CPL全部满足,同时:RPL<=门DPL |
相关文章:
4. 权限,特权
对数据段特权检查对直接转移的代码段特权检查栈段的检查调用门的检查 权限问题: 由于CPL,DPL 无法完整表达权限的问题. 例如用户程序(CPL3)通过调用门(将调用到内核过程,从低权限到高权限)执行,此时CPL0,此时可以为所欲为.因此加入RPL.此参数由操作系统来保证,CPU仅使用 RPL:…...
云原生系列Go语言篇-泛型Part 2
类型推导和泛型 就像在使用:时支持类型推导一样,在调用泛型函数时Go同样支持类型推导。可在上面对Map、Filter和Reduce调用中看出。有些场景无法进行类型推导(如类型参数仅用作返回值)。这时,必…...
借助ETL快速查询金蝶云星空表单信息
随着数字化转型的加速,企业信息化程度越来越高,大量的数据产生并存储在云端,需要进行有效的数据管理和查询。金蝶云星空是金蝶云旗下的一款云ERP产品,为企业提供了完整的业务流程和数据管理功能,因此需要进行有效的数据…...
基于深度学习的驾驶员状态监测预警系统(正文)
摘 要 近年来驾驶员因疲劳驾驶而造成的交通事故逐年增多,驾驶员的驾驶状态对道路和人身安全产生重大影响,因此做好驾驶员驾驶状态的管理及预警是非常有必要的。 随着深度学习在目标检测算法应用的不断深入,YOLOv5等目标检测算法也相继具有了广…...
读书笔记之《价值》张磊
读书笔记之《价值》张磊 自序 这是一条长期主义之路 长期主义——把时间和信念投入能够长期产生价值的事情中,尽力学习最有效率的思维方式和行为标准,遵循第一性原理,永远探求真理。 真正的投资,有且只有一条标准,那…...
【shell】文本三剑客之sed详解
目录 一、sed简介(行编辑器) 二、基本用法 三、sed脚本格式(匹配地址 脚本命令) 1、不给地址,那么就是针对全文处理 2、单地址,表示#,指定的行,$表示最后一行,/pattt…...
Centos7 制作Openssh9.5 RPM包
Centos7 制作Openssh9.5 RPM包 最近都在升级Openssh版本到9.3.在博客里也放了openssh 9.5的rpm包. 详见:https://blog.csdn.net/qq_29974229/article/details/133878576 但还是有小伙伴不停追问这个rpm包是怎么做的,怕下载别人的rpm包里被加了盐. 于是做了个关于怎么用官方的o…...
C语言--每日选择题--Day30
第一题 1. i 5,j 7,i | j 等于多少? A:1 B:3 C:5 D:7 答案及解析 D |这个是按位或运算符,两个数的二进制位,有1为1,同0为0; i的二进…...
LeetCode 274. H指数——排序
274. H 指数 给你一个整数数组 citations ,其中 citations[i] 表示研究者的第 i 篇论文被引用的次数。计算并返回该研究者的 h 指数。 根据维基百科上 h 指数的定义:h 代表“高引用次数” ,一名科研人员的 h 指数 是指他(她&…...
【洛谷 B2038】奇偶 ASCII 值判断 题解(顺序结构+取余)
奇偶 ASCII 值判断 题目描述 任意输入一个字符,判断其 ASCII 是否是奇数,若是,输出 YES,否则,输出 NO 。 例如,字符 A 的 ASCII 值是 65,则输出 YES,若输入字符 B(ASCII 值是 66…...
Ubuntu 20.4 源代码方式安装 cdo(笔记)
目录 动机安装过程python 调用cdo 动机 我找到的处理 era5-land 代码在需要用到 cdo,但是 sudo apt-get install cdo 总是出现 abort (core dump) 等问题,所以放弃这种安装方式,不走捷径,安装源代码,也就是 cdo-x.x.x…...
电子学会C/C++编程等级考试2022年12月(三级)真题解析
C/C++等级考试(1~8级)全部真题・点这里 第1题:鸡兔同笼 一个笼子里面关了鸡和兔子(鸡有2只脚,兔子有4只脚,没有例外)。已经知道了笼子里面脚的总数a,问笼子里面至少有多少只动物,至多有多少只动物。 时间限制:1000 内存限制:65536输入 一行,一个正整数a (a < 327…...
二叉树的最近公共祖先(C++实现)
二叉树的最近公共祖先 题目思路代码(详细注释) 题目 二叉树的最近公共祖先 思路 我们可以通过两个栈来实现 实现一个FindPath函数,用来查找从根节点到目标节点的路径(路径可以用栈来保存) 路径保存好后,…...
【conda】容易遗忘的命令使用总结
1. 在空conda虚拟环境中安装python 退出到base环境 conda activate base 执行命令 conda install -n 空环境名 python版本名 例如: conda install -n test python3.10 2. 无需确认直接创建环境 在末尾加上-y,例如: conda create -n tes…...
蓝桥杯第一天-----时间显示
文章目录 前言一、题目描述二、测试用例三、题目分析四、具体代码实现总结 前言 本章中将相信介绍蓝桥杯中关于时间显示的题目。 链接:https://www.lanqiao.cn/problems/1452/learning/ 一、题目描述 二、测试用例 三、题目分析 1.输入的时间为毫秒,毫…...
多文件夹图片预处理:清除空值、重置大小、分割训练集
→ 清理空值 防止出现cannot identify image file 参考Python数据清洗----删除读取失败图片__简单版_python用pil读取图片出错删除掉-CSDN博客 import os import shutil import warnings import cv2 import iofrom PIL import Image warnings.filterwarnings("error&qu…...
【Java】集合 之 使用 Map
为什么使用Map 我们知道,List是一种顺序列表,如果有一个存储学生Student实例的List,要在List中根据name查找某个指定的Student的分数,应该怎么办? 最简单的方法是遍历List并判断name是否相等,然后返回指定…...
第二证券:股票几点到几点开盘?
作为股民或许投资者,我们都知道股票是每天都有开盘和收盘时间的。但是,关于股票的开盘时间,很多人并不是很清楚,特别是初学者。在本文中,我们将从多个视点分析股票开盘时间,并为大家供给一些有用的信息。 …...
goweb入门教程
本文是作者自己学习goweb时写的笔记,分享给大家,希望能有些帮助 前言: 关于web:本质 web中最重要的就是浏览器和服务器的request(请求)和response(响应); 一个请求对应一个响应。 一个请求对应一个响应&…...
量子计算:探索未来的计算技术
量子计算:探索未来的计算技术 引言 在过去的几十年里,我们见证了计算机技术从简单的计算和存储发展到复杂的数据处理和人工智能的飞速进步。然而,随着我们进一步探索科技的前沿,传统的计算方法开始显示出其局限性。在这种情况下,量子计算——一种基于量子力学原理的新型计…...
大话软工笔记—需求分析概述
需求分析,就是要对需求调研收集到的资料信息逐个地进行拆分、研究,从大量的不确定“需求”中确定出哪些需求最终要转换为确定的“功能需求”。 需求分析的作用非常重要,后续设计的依据主要来自于需求分析的成果,包括: 项目的目的…...
VB.net复制Ntag213卡写入UID
本示例使用的发卡器:https://item.taobao.com/item.htm?ftt&id615391857885 一、读取旧Ntag卡的UID和数据 Private Sub Button15_Click(sender As Object, e As EventArgs) Handles Button15.Click轻松读卡技术支持:网站:Dim i, j As IntegerDim cardidhex, …...
SciencePlots——绘制论文中的图片
文章目录 安装一、风格二、1 资源 安装 # 安装最新版 pip install githttps://github.com/garrettj403/SciencePlots.git# 安装稳定版 pip install SciencePlots一、风格 简单好用的深度学习论文绘图专用工具包–Science Plot 二、 1 资源 论文绘图神器来了:一行…...
可靠性+灵活性:电力载波技术在楼宇自控中的核心价值
可靠性灵活性:电力载波技术在楼宇自控中的核心价值 在智能楼宇的自动化控制中,电力载波技术(PLC)凭借其独特的优势,正成为构建高效、稳定、灵活系统的核心解决方案。它利用现有电力线路传输数据,无需额外布…...
【解密LSTM、GRU如何解决传统RNN梯度消失问题】
解密LSTM与GRU:如何让RNN变得更聪明? 在深度学习的世界里,循环神经网络(RNN)以其卓越的序列数据处理能力广泛应用于自然语言处理、时间序列预测等领域。然而,传统RNN存在的一个严重问题——梯度消失&#…...
Python爬虫(二):爬虫完整流程
爬虫完整流程详解(7大核心步骤实战技巧) 一、爬虫完整工作流程 以下是爬虫开发的完整流程,我将结合具体技术点和实战经验展开说明: 1. 目标分析与前期准备 网站技术分析: 使用浏览器开发者工具(F12&…...
CMake 从 GitHub 下载第三方库并使用
有时我们希望直接使用 GitHub 上的开源库,而不想手动下载、编译和安装。 可以利用 CMake 提供的 FetchContent 模块来实现自动下载、构建和链接第三方库。 FetchContent 命令官方文档✅ 示例代码 我们将以 fmt 这个流行的格式化库为例,演示如何: 使用 FetchContent 从 GitH…...
Android15默认授权浮窗权限
我们经常有那种需求,客户需要定制的apk集成在ROM中,并且默认授予其【显示在其他应用的上层】权限,也就是我们常说的浮窗权限,那么我们就可以通过以下方法在wms、ams等系统服务的systemReady()方法中调用即可实现预置应用默认授权浮…...
学校时钟系统,标准考场时钟系统,AI亮相2025高考,赛思时钟系统为教育公平筑起“精准防线”
2025年#高考 将在近日拉开帷幕,#AI 监考一度冲上热搜。当AI深度融入高考,#时间同步 不再是辅助功能,而是决定AI监考系统成败的“生命线”。 AI亮相2025高考,40种异常行为0.5秒精准识别 2025年高考即将拉开帷幕,江西、…...
Python基于历史模拟方法实现投资组合风险管理的VaR与ES模型项目实战
说明:这是一个机器学习实战项目(附带数据代码文档),如需数据代码文档可以直接到文章最后关注获取。 1.项目背景 在金融市场日益复杂和波动加剧的背景下,风险管理成为金融机构和个人投资者关注的核心议题之一。VaR&…...
