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(响应); 一个请求对应一个响应。 一个请求对应一个响应&…...
量子计算:探索未来的计算技术
量子计算:探索未来的计算技术 引言 在过去的几十年里,我们见证了计算机技术从简单的计算和存储发展到复杂的数据处理和人工智能的飞速进步。然而,随着我们进一步探索科技的前沿,传统的计算方法开始显示出其局限性。在这种情况下,量子计算——一种基于量子力学原理的新型计…...
多云管理“拦路虎”:深入解析网络互联、身份同步与成本可视化的技术复杂度
一、引言:多云环境的技术复杂性本质 企业采用多云策略已从技术选型升维至生存刚需。当业务系统分散部署在多个云平台时,基础设施的技术债呈现指数级积累。网络连接、身份认证、成本管理这三大核心挑战相互嵌套:跨云网络构建数据…...
React hook之useRef
React useRef 详解 useRef 是 React 提供的一个 Hook,用于在函数组件中创建可变的引用对象。它在 React 开发中有多种重要用途,下面我将全面详细地介绍它的特性和用法。 基本概念 1. 创建 ref const refContainer useRef(initialValue);initialValu…...
AI Agent与Agentic AI:原理、应用、挑战与未来展望
文章目录 一、引言二、AI Agent与Agentic AI的兴起2.1 技术契机与生态成熟2.2 Agent的定义与特征2.3 Agent的发展历程 三、AI Agent的核心技术栈解密3.1 感知模块代码示例:使用Python和OpenCV进行图像识别 3.2 认知与决策模块代码示例:使用OpenAI GPT-3进…...
PPT|230页| 制造集团企业供应链端到端的数字化解决方案:从需求到结算的全链路业务闭环构建
制造业采购供应链管理是企业运营的核心环节,供应链协同管理在供应链上下游企业之间建立紧密的合作关系,通过信息共享、资源整合、业务协同等方式,实现供应链的全面管理和优化,提高供应链的效率和透明度,降低供应链的成…...
解决Ubuntu22.04 VMware失败的问题 ubuntu入门之二十八
现象1 打开VMware失败 Ubuntu升级之后打开VMware上报需要安装vmmon和vmnet,点击确认后如下提示 最终上报fail 解决方法 内核升级导致,需要在新内核下重新下载编译安装 查看版本 $ vmware -v VMware Workstation 17.5.1 build-23298084$ lsb_release…...
使用分级同态加密防御梯度泄漏
抽象 联邦学习 (FL) 支持跨分布式客户端进行协作模型训练,而无需共享原始数据,这使其成为在互联和自动驾驶汽车 (CAV) 等领域保护隐私的机器学习的一种很有前途的方法。然而,最近的研究表明&…...
AtCoder 第409场初级竞赛 A~E题解
A Conflict 【题目链接】 原题链接:A - Conflict 【考点】 枚举 【题目大意】 找到是否有两人都想要的物品。 【解析】 遍历两端字符串,只有在同时为 o 时输出 Yes 并结束程序,否则输出 No。 【难度】 GESP三级 【代码参考】 #i…...
Opencv中的addweighted函数
一.addweighted函数作用 addweighted()是OpenCV库中用于图像处理的函数,主要功能是将两个输入图像(尺寸和类型相同)按照指定的权重进行加权叠加(图像融合),并添加一个标量值&#x…...
高等数学(下)题型笔记(八)空间解析几何与向量代数
目录 0 前言 1 向量的点乘 1.1 基本公式 1.2 例题 2 向量的叉乘 2.1 基础知识 2.2 例题 3 空间平面方程 3.1 基础知识 3.2 例题 4 空间直线方程 4.1 基础知识 4.2 例题 5 旋转曲面及其方程 5.1 基础知识 5.2 例题 6 空间曲面的法线与切平面 6.1 基础知识 6.2…...
unix/linux,sudo,其发展历程详细时间线、由来、历史背景
sudo 的诞生和演化,本身就是一部 Unix/Linux 系统管理哲学变迁的微缩史。来,让我们拨开时间的迷雾,一同探寻 sudo 那波澜壮阔(也颇为实用主义)的发展历程。 历史背景:su的时代与困境 ( 20 世纪 70 年代 - 80 年代初) 在 sudo 出现之前,Unix 系统管理员和需要特权操作的…...
