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

4. 权限,特权

  • 对数据段特权检查
  • 对直接转移的代码段特权检查
  • 栈段的检查
  • 调用门的检查

权限问题:

  • 由于CPL,DPL 无法完整表达权限的问题.
    例如用户程序(CPL=3)通过调用门(将调用到内核过程,从低权限到高权限)执行,此时CPL=0,此时可以为所欲为.
  • 因此加入RPL.此参数由操作系统来保证,CPU仅使用
    1. RPL: 想以哪种权限去访问, 操作系统来填写, 一个自由的参数
    1. 描述符里的DPL=CPL=CS.RPL(16位中的低2位)
    1. DPL:访问此描述符的权限

对于数据段的特权检查:

从大方向说:只要权限比数据段大 ,或者相等就OK
实际根据以下几个步骤:
CPL:当前CS段的RPL, RPL:请求这个数据段的权限, DPL: 数据段的权限

    1. 根据CPL, RPL , DPL 这3个来检查
    1. 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 , 因此不做检查
    1. 调用过程的CPL,RPL
    1. 转移到此处的目标描述符的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=0CPL不一致,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 ~ 161514 ~ 131211 ~ 87 ~ 54 ~ 0
段内偏移高16位PDPL0TYPE(1100)000参数个数
31 ~ 1615 ~ 0
段选择子段内偏移低16位
  • 调用门需要4项检查:
  • 当前调用者的CPL
  • 调用门选择子RPL (操作系统 自己维护)
  • 调用门描述符DPL
  • 目标代码段描述符的DPL
  • 检查2步:
    1. 首先要满足 本身能够访问调用门:CPL <= 门DPL, RPL <= 门DPL
    1. 下表格:
指令一致性代码段非一致性代码段
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不变,栈不变
  • 对于非一致性代码段:
    1. CALL指令要求: CPL >= 目标代码段DPL , CPL变成目标代码段DPL, 切换栈(除非CPL=DPL,那么栈不变)
    1. JMP 指令: CPL = 目标代码段DPL , CPL不变,栈不变
  • 看上去内容有点多,需要到处判断,一会门检查,一会代码段DPL检查,还要考虑栈切换的问题
  • 实际没那么麻烦,也就2条需要注意的
    1. 一个是有权限访问门 ,也就是本身权限至少要与门相等 数值上: CPL <= 门DPL, RPL <=门DPL
    1. 调用者代码段的权限,要低于代码段或相等,也就是低权限到高权限,那么数值上: CPL>= 目标代码段DPL
  • 至于jmp 和 call 的区别不用记, 让CPU产生保护性异常(GP)告诉我们即可,一旦产生异常说明此处jmp 指令有问题了( CPL != DPL)
  • 对于栈的问题,一句话就解决,CPL一变, 栈跟着变 ; CPL不变,栈也不变

调用门的首次检查例子:

门描述符代码段A代码段B代码段C代码段D-
门DPL=3CPL=3CPL=2CPL=1CPL=0代码段A,B,C,D任意+RPL=0~3都可以访问
门DPL=2CPL=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

类型推导和泛型 就像在使用​​:​​时支持类型推导一样&#xff0c;在调用泛型函数时Go同样支持类型推导。可在上面对​​Map​​、​​Filter​​和​​Reduce​​调用中看出。有些场景无法进行类型推导&#xff08;如类型参数仅用作返回值&#xff09;。这时&#xff0c;必…...

借助ETL快速查询金蝶云星空表单信息

随着数字化转型的加速&#xff0c;企业信息化程度越来越高&#xff0c;大量的数据产生并存储在云端&#xff0c;需要进行有效的数据管理和查询。金蝶云星空是金蝶云旗下的一款云ERP产品&#xff0c;为企业提供了完整的业务流程和数据管理功能&#xff0c;因此需要进行有效的数据…...

基于深度学习的驾驶员状态监测预警系统(正文)

摘 要 近年来驾驶员因疲劳驾驶而造成的交通事故逐年增多&#xff0c;驾驶员的驾驶状态对道路和人身安全产生重大影响&#xff0c;因此做好驾驶员驾驶状态的管理及预警是非常有必要的。 随着深度学习在目标检测算法应用的不断深入&#xff0c;YOLOv5等目标检测算法也相继具有了广…...

读书笔记之《价值》张磊

读书笔记之《价值》张磊 自序 这是一条长期主义之路 长期主义——把时间和信念投入能够长期产生价值的事情中&#xff0c;尽力学习最有效率的思维方式和行为标准&#xff0c;遵循第一性原理&#xff0c;永远探求真理。 真正的投资&#xff0c;有且只有一条标准&#xff0c;那…...

【shell】文本三剑客之sed详解

目录 一、sed简介&#xff08;行编辑器&#xff09; 二、基本用法 三、sed脚本格式&#xff08;匹配地址 脚本命令&#xff09; 1、不给地址&#xff0c;那么就是针对全文处理 2、单地址&#xff0c;表示#&#xff0c;指定的行&#xff0c;$表示最后一行&#xff0c;/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&#xff0c;j 7&#xff0c;i | j 等于多少&#xff1f; A&#xff1a;1 B&#xff1a;3 C&#xff1a;5 D&#xff1a;7 答案及解析 D &#xff5c;这个是按位或运算符&#xff0c;两个数的二进制位&#xff0c;有1为1&#xff0c;同0为0&#xff1b; i的二进…...

LeetCode 274. H指数——排序

274. H 指数 给你一个整数数组 citations &#xff0c;其中 citations[i] 表示研究者的第 i 篇论文被引用的次数。计算并返回该研究者的 h 指数。 根据维基百科上 h 指数的定义&#xff1a;h 代表“高引用次数” &#xff0c;一名科研人员的 h 指数 是指他&#xff08;她&…...

【洛谷 B2038】奇偶 ASCII 值判断 题解(顺序结构+取余)

奇偶 ASCII 值判断 题目描述 任意输入一个字符&#xff0c;判断其 ASCII 是否是奇数&#xff0c;若是&#xff0c;输出 YES&#xff0c;否则&#xff0c;输出 NO 。 例如&#xff0c;字符 A 的 ASCII 值是 65&#xff0c;则输出 YES&#xff0c;若输入字符 B(ASCII 值是 66…...

Ubuntu 20.4 源代码方式安装 cdo(笔记)

目录 动机安装过程python 调用cdo 动机 我找到的处理 era5-land 代码在需要用到 cdo&#xff0c;但是 sudo apt-get install cdo 总是出现 abort (core dump) 等问题&#xff0c;所以放弃这种安装方式&#xff0c;不走捷径&#xff0c;安装源代码&#xff0c;也就是 cdo-x.x.x…...

电子学会C/C++编程等级考试2022年12月(三级)真题解析

C/C++等级考试(1~8级)全部真题・点这里 第1题:鸡兔同笼 一个笼子里面关了鸡和兔子(鸡有2只脚,兔子有4只脚,没有例外)。已经知道了笼子里面脚的总数a,问笼子里面至少有多少只动物,至多有多少只动物。 时间限制:1000 内存限制:65536输入 一行,一个正整数a (a < 327…...

二叉树的最近公共祖先(C++实现)

二叉树的最近公共祖先 题目思路代码&#xff08;详细注释&#xff09; 题目 二叉树的最近公共祖先 思路 我们可以通过两个栈来实现 实现一个FindPath函数&#xff0c;用来查找从根节点到目标节点的路径&#xff08;路径可以用栈来保存&#xff09; 路径保存好后&#xff0c;…...

【conda】容易遗忘的命令使用总结

1. 在空conda虚拟环境中安装python 退出到base环境 conda activate base 执行命令 conda install -n 空环境名 python版本名 例如&#xff1a; conda install -n test python3.10 2. 无需确认直接创建环境 在末尾加上-y&#xff0c;例如&#xff1a; conda create -n tes…...

蓝桥杯第一天-----时间显示

文章目录 前言一、题目描述二、测试用例三、题目分析四、具体代码实现总结 前言 本章中将相信介绍蓝桥杯中关于时间显示的题目。 链接&#xff1a;https://www.lanqiao.cn/problems/1452/learning/ 一、题目描述 二、测试用例 三、题目分析 1.输入的时间为毫秒&#xff0c;毫…...

多文件夹图片预处理:清除空值、重置大小、分割训练集

→ 清理空值 防止出现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 我们知道&#xff0c;List是一种顺序列表&#xff0c;如果有一个存储学生Student实例的List&#xff0c;要在List中根据name查找某个指定的Student的分数&#xff0c;应该怎么办&#xff1f; 最简单的方法是遍历List并判断name是否相等&#xff0c;然后返回指定…...

第二证券:股票几点到几点开盘?

作为股民或许投资者&#xff0c;我们都知道股票是每天都有开盘和收盘时间的。但是&#xff0c;关于股票的开盘时间&#xff0c;很多人并不是很清楚&#xff0c;特别是初学者。在本文中&#xff0c;我们将从多个视点分析股票开盘时间&#xff0c;并为大家供给一些有用的信息。 …...

goweb入门教程

本文是作者自己学习goweb时写的笔记&#xff0c;分享给大家&#xff0c;希望能有些帮助 前言&#xff1a; 关于web&#xff1a;本质 ​ ​ web中最重要的就是浏览器和服务器的request(请求)和response(响应)&#xff1b; ​ 一个请求对应一个响应。 一个请求对应一个响应&…...

量子计算:探索未来的计算技术

量子计算:探索未来的计算技术 引言 在过去的几十年里,我们见证了计算机技术从简单的计算和存储发展到复杂的数据处理和人工智能的飞速进步。然而,随着我们进一步探索科技的前沿,传统的计算方法开始显示出其局限性。在这种情况下,量子计算——一种基于量子力学原理的新型计…...

web vue 项目 Docker化部署

Web 项目 Docker 化部署详细教程 目录 Web 项目 Docker 化部署概述Dockerfile 详解 构建阶段生产阶段 构建和运行 Docker 镜像 1. Web 项目 Docker 化部署概述 Docker 化部署的主要步骤分为以下几个阶段&#xff1a; 构建阶段&#xff08;Build Stage&#xff09;&#xff1a…...

JavaSec-RCE

简介 RCE(Remote Code Execution)&#xff0c;可以分为:命令注入(Command Injection)、代码注入(Code Injection) 代码注入 1.漏洞场景&#xff1a;Groovy代码注入 Groovy是一种基于JVM的动态语言&#xff0c;语法简洁&#xff0c;支持闭包、动态类型和Java互操作性&#xff0c…...

HTML 语义化

目录 HTML 语义化HTML5 新特性HTML 语义化的好处语义化标签的使用场景最佳实践 HTML 语义化 HTML5 新特性 标准答案&#xff1a; 语义化标签&#xff1a; <header>&#xff1a;页头<nav>&#xff1a;导航<main>&#xff1a;主要内容<article>&#x…...

设计模式和设计原则回顾

设计模式和设计原则回顾 23种设计模式是设计原则的完美体现,设计原则设计原则是设计模式的理论基石, 设计模式 在经典的设计模式分类中(如《设计模式:可复用面向对象软件的基础》一书中),总共有23种设计模式,分为三大类: 一、创建型模式(5种) 1. 单例模式(Sing…...

基于服务器使用 apt 安装、配置 Nginx

&#x1f9fe; 一、查看可安装的 Nginx 版本 首先&#xff0c;你可以运行以下命令查看可用版本&#xff1a; apt-cache madison nginx-core输出示例&#xff1a; nginx-core | 1.18.0-6ubuntu14.6 | http://archive.ubuntu.com/ubuntu focal-updates/main amd64 Packages ng…...

解锁数据库简洁之道:FastAPI与SQLModel实战指南

在构建现代Web应用程序时&#xff0c;与数据库的交互无疑是核心环节。虽然传统的数据库操作方式&#xff08;如直接编写SQL语句与psycopg2交互&#xff09;赋予了我们精细的控制权&#xff0c;但在面对日益复杂的业务逻辑和快速迭代的需求时&#xff0c;这种方式的开发效率和可…...

基础测试工具使用经验

背景 vtune&#xff0c;perf, nsight system等基础测试工具&#xff0c;都是用过的&#xff0c;但是没有记录&#xff0c;都逐渐忘了。所以写这篇博客总结记录一下&#xff0c;只要以后发现新的用法&#xff0c;就记得来编辑补充一下 perf 比较基础的用法&#xff1a; 先改这…...

GitHub 趋势日报 (2025年06月08日)

&#x1f4ca; 由 TrendForge 系统生成 | &#x1f310; https://trendforge.devlive.org/ &#x1f310; 本日报中的项目描述已自动翻译为中文 &#x1f4c8; 今日获星趋势图 今日获星趋势图 884 cognee 566 dify 414 HumanSystemOptimization 414 omni-tools 321 note-gen …...

SAP学习笔记 - 开发26 - 前端Fiori开发 OData V2 和 V4 的差异 (Deepseek整理)

上一章用到了V2 的概念&#xff0c;其实 Fiori当中还有 V4&#xff0c;咱们这一章来总结一下 V2 和 V4。 SAP学习笔记 - 开发25 - 前端Fiori开发 Remote OData Service(使用远端Odata服务)&#xff0c;代理中间件&#xff08;ui5-middleware-simpleproxy&#xff09;-CSDN博客…...

HTML前端开发:JavaScript 获取元素方法详解

作为前端开发者&#xff0c;高效获取 DOM 元素是必备技能。以下是 JS 中核心的获取元素方法&#xff0c;分为两大系列&#xff1a; 一、getElementBy... 系列 传统方法&#xff0c;直接通过 DOM 接口访问&#xff0c;返回动态集合&#xff08;元素变化会实时更新&#xff09;。…...