保护模式中的特权级

简介: 保护模式中的特权级

引言

  • 在上一章节中提过,调用门可以实现不同特权级的代码之间跳转执行
  • 不能直接跳转吗?我们先来做个小实验
  • 将 Task A 中代码段选择符中的特权级由 0 改 为 3 ,然后编译运行一下看看效果
; TASK_A_CODE32_SELECTOR equ (0x0000 << 3) + SA_RPL0 + SA_TIL
TASK_A_CODE32_SELECTOR equ (0x0000 << 3) + SA_RPL3 + SA_TIL
  • 实验结果:原本应该打印的字符串 “Task A”,并没有打印出来,程序崩溃了
  • 结论:不同特权级的代码之间并不能随意跳转
  • 想要搞清楚原因,就需要先对特权级进行一定的了解

特权级

  • 我们知道,保护模式下, CPU 提供各种各样的保护机制,比如段界限,指定范围;段属性,指定读写等权限等等。这些都比较好理解,在这里就不总结了
  • 保护模式下, CPU 还提供了有关特权级的保护机制
  • 处理器的段保护机制可以识别 4 个特权级(或特权层),0 级到 3 级。数值越大,特权越小

  • 处理器利用特权级来防止运行在较低特权级的程序或任务访问具有较高特权级的一个段
  • 我们熟知的 linux 系统只使用了特权级 0(内核)和特权级 3(应用)

与特权级相关的三个概念

  • 当前特权级 CPL(Current Privilege Level)
  • CPL 是当前正在执行程序或任务的特权级。它存放在 CS 和 SS 段寄存器的位 0 和位 1 中
  • 当程序把控制转移到另一个具有不同特权级的代码段中时,处理器就会改变 CPL
  • 处理器进入保护模式后,CPL = 0(最高特权级)
  • 描述符特权级 DPL(Descriptor Privilege Level)
  • DPL 是一个段或门的特权级。它存放在段或门描述符的 DPL 字段中
  • 在当前执行代码段试图访问一个段或门时,段或门的 DPL 会用来与 CPL 以及段或门选择符中的 RPL 作比较
  • 根据被访问的段或门的类型不同,DPL 也有不同的含义,这里先不深究,后面再做介绍
  • 请求特权级 RPL(Request Privilege Level)
  • RPL 是一种赋予段选择符的超越特权级,它存放在选择符的位 0 和位 1 中
  • 处理器会同时检查 RPL 和 CPL,以确定是否允许访问一个段

CPL、DPL 和 RPL 的关系

  • 当处理器从 A 代码段成功跳转到 B 代码段执行
  • 跳转前: CPL = DPL(A)
  • 跳转后: CPL = DPL(B)
  • 当处理器运行过程中需要访问数据段时
  • CPL <= DPL(Data)
  • 在请求某特权级为 DPL 级别的资源时,参与特权检查的不只是 CPL,还要加上 RPL. CPL 和 RPL 的特权必须同时大于等于受访者的特权 DPL,即:数值上 CPL <= DPL 并且 RPL <= DPL

再做小实验

  • 先对段描述符中 DPL 属性进行宏定义
; 段描述符中 DPL 属性定义(段描述符高 32 位的 bit13-bit14 )
DA_DPL0     equ    0x00  ; DPL = 0
DA_DPL1     equ    0x20  ; DPL = 1
DA_DPL2     equ    0x40  ; DPL = 2
DA_DPL3     equ    0x60  ; DPL = 3
  • 给全局描述符表中 32 位代码段增加属性 DPL = 3
; CODE32_DESC : Descriptor 0, CODE32_SEG_LEN - 1, DA_C + DA_32
CODE32_DESC : Descriptor 0, CODE32_SEG_LEN - 1, DA_C + DA_32 + DA_DPL3
  • 运行一下,不出意外,果然不能运行,CODE32_START 代码段并没有运行,这说明高特权级代码段不能够跳转到低特权级的代码段
  • 将本章节 RPL、DPL 有关的改动都恢复一下,恢复后代码(可以运行):loader.asm
  • 同样的实验我们也在数据段上做一次,改动如下:
; DATA_DESC : Descriptor 0, DATA_SEG_LEN - 1, DA_DR + DA_32
DATA_DESC : Descriptor 0, DATA_SEG_LEN - 1, DA_DR + DA_32 + DA_DPL3
  • 运行一下,居然未发生任何错误
  • 再改一下:
; DATA_SELECTOR equ (0x0003 << 3) + SA_RPL0 + SA_TIG
DATA_SELECTOR equ (0x0003 << 3) + SA_RPL3 + SA_TIG
  • 还是未发生任何错误
  • 再改一下:
; DATA_DESC : Descriptor 0, DATA_SEG_LEN - 1, DA_DR + DA_32
DATA_DESC : Descriptor 0, DATA_SEG_LEN - 1, DA_DR + DA_32 + DA_DPL2
; DATA_SELECTOR equ (0x0003 << 3) + SA_RPL0 + SA_TIG
DATA_SELECTOR equ (0x0003 << 3) + SA_RPL3 + SA_TIG
  • 这回出错了,这说明请求特权级 RPL 不能够请求比它更高级的特权级数据段,但是可以请求到比它低级的特权级的数据段。
  • 再对栈段做下实验
  • 程序再次恢复到 loader.asm
  • 改动如下:
; STACK32_DESC : Descriptor 0, TOP_OF_STACK32, DA_DRW + DA_32
STACK32_DESC : Descriptor 0, TOP_OF_STACK32, DA_DRW + DA_32 + DA_DPL3
; STACK32_SELECTOR equ (0x0004 << 3) + SA_RPL0 + SA_TIG
STACK32_SELECTOR equ (0x0004 << 3) + SA_RPL3 + SA_TIG
  • 凭感觉栈段应该跟数据段一样,结果程序崩了。这说明栈段的特权级检测规则跟数据段不一样,好吧,代码段、数据段、栈段各自有各自的检测规则
  • 是不是有点乱糟糟的,暂时先不要一下子理清楚所有的规则,以后再在各种场景下具体体会,目前先有个感性的认识就好


目录
相关文章
|
运维 数据可视化 数据处理
PyTimeTK: 一个简单有效的时间序列分析库
时间序列分析是数据科学的重要组成部分,特别是在金融、经济、天气预报等领域。它包括分析随时间收集或索引的数据点,以确定趋势、周期或季节变化。由于时间序列数据的复杂性所以分析时间序列需要复杂统计方法,我最近在Github上发现了一个刚刚发布不久的Python时间工具包PyTimeTK ,它可以帮我们简化时间序列分析的很多步骤。
229 4
|
10月前
|
数据采集 监控 安全
数字孪生与金融:风险管理的新工具
数字孪生技术通过构建物理实体或系统的虚拟模型,实现对金融市场的实时监控、客户行为分析、市场风险预测及业务流程优化,为金融机构提供了全新的风险管理工具,提升了风险管理的精准度和效率。
|
10月前
|
分布式计算 大数据 BI
ClickHouse与大数据生态整合:从ETL到BI报表
【10月更文挑战第27天】在这个数据驱动的时代,企业越来越依赖于数据来做出关键决策。而高效的数据处理和分析能力则是支撑这一需求的基础。作为一位数据工程师,我有幸参与到一个项目中,该项目旨在利用ClickHouse与Hadoop、Spark、Flink等大数据处理框架的整合,构建一个从数据提取(Extract)、转换(Transform)、加载(Load)到最终生成商业智能(BI)报表的全流程解决方案。以下是我在这个项目中的经验和思考。
405 1
|
消息中间件 缓存 Unix
[面试必备]嵌入式Linux内核开发必须了解的三十道题
[面试必备]嵌入式Linux内核开发必须了解的三十道题
|
SQL 存储 安全
SQL入门与进阶:数据库查询与管理的实用指南
一、引言 在数字化时代,数据库已经成为各行各业存储、管理和分析数据的关键基础设施
|
C语言
深入理解C语言中的printf函数及数据输出
深入理解C语言中的printf函数及数据输出
832 0
|
编译器 C++
Visual Studio 2022中创建的C++项目无法使用万能头<bits/stdc++.h>解决方案
Visual Studio 2022中创建的C++项目无法使用万能头<bits/stdc++.h>解决方案
550 0
Visual Studio 2022中创建的C++项目无法使用万能头<bits/stdc++.h>解决方案
|
Ubuntu Linux 芯片
史上最全的LED点灯程序—使用STM32、FPGA、Linux点亮你的LED灯
不知道小伙伴们点亮过多少板子的LED灯,有很多小伙伴留言说讲一下stm32、fpga、liunx他们之间有什么不同,不同点很多,口说无凭,今天就来点亮一下stm32、fpga和liunx板子的led灯,大家大致看一下点灯流程和点灯环境以及点灯流程,就能大概的了解一下三者的区别,可以有选择的去学习!
538 0
史上最全的LED点灯程序—使用STM32、FPGA、Linux点亮你的LED灯
|
机器学习/深度学习 算法
【MATLAB】数据拟合第13期-基于最小二乘支持向量机的拟合
【MATLAB】数据拟合第13期-基于最小二乘支持向量机的拟合
322 1
|
算法 决策智能 Python
Python高级算法——线性规划(Linear Programming)
Python高级算法——线性规划(Linear Programming)
944 0
Python高级算法——线性规划(Linear Programming)