x86 保护模式下的特权级访问控制机制详解

目录

一、段的类型与基本语义

1. 代码段(Code Segment)

2. 数据段(Data Segment)

3. 栈段(Stack Segment)

二、特权级三要素定义

三、访问控制规则详解

(1)数据段与栈段访问

(2)代码段跳转

四、特权级切换的受控机制

1. 特权级提升(CPL 数值变小)

2. 特权级降级(CPL 数值变大)

五、初始 CPL 的建立

六、设计哲学与安全意义

在 x86 保护模式下,内存访问机制的核心在于段描述符与特权级保护模型的协同作用。该模型通过区分代码段(执行身份)与数据段/栈段(资源访问)的不同语义,实现了对系统安全与功能需求的精细控制。以下是对这一机制的系统性梳理,条理清晰、无重复,便于深入理解。


一、段的类型与基本语义

1. 代码段(Code Segment)
  • 用途:存放可执行指令,由 CS 寄存器指向。
  • 关键属性
    • Type 字段中 X=1(可执行)。
    • 是否为一致代码段由 C 位决定:
      • C=0(非一致):仅允许平级跳转(CPL == DPL)。
      • C=1(一致):允许低特权代码跳入(CPL ≥ DPL),但 CPL 不变。
  • 特权身份来源:CS 选择子的 RPL 即为当前 CPL(CPL = CS.RPL),这是整个权限模型的锚点。
2. 数据段(Data Segment)
  • 用途:存放全局/静态数据,由 DS、ES、FS、GS 指向。
  • 关键属性
    • X=0(不可执行),通常可读/可写。
    • 所有数据段均为“非一致”,但“非一致”一词在此仅表示“禁止低特权访问高 DPL 段”,不适用 CPL == DPL 规则
  • 访问规则max(CPL, RPL) ≤ DPL
3. 栈段(Stack Segment)
  • 用途:函数调用、中断现场保存,由 SS 指向。
  • 本质:特殊的数据段,但访问规则更严格。
  • 加载 SS 时要求CPL == RPL == DPL(三者必须完全一致)。
  • CPL 仍由 CS.RPL 决定,而非 SS.RPL。

二、特权级三要素定义

要素

含义

存储位置

作用

DPL(Descriptor Privilege Level)

段的“访问门槛”

段描述符中(2 位,0~3)

定义访问该段所需的最低特权级

CPL(Current Privilege Level)

当前执行代码的特权级

= CS.RPL

代表 CPU 当前的“执行身份”

RPL(Requested Privilege Level)

请求访问时声明的权限

段选择子低 2 位

限制高特权代码代表低特权主体时的权限

关键澄清

  • CPL 仅由 CS.RPL 定义,其他段寄存器的 RPL 不影响 CPL。
  • 实际权限检查使用 有效请求级 = max(CPL, RPL)

三、访问控制规则详解

(1)数据段与栈段访问
  • 通用规则(DS/ES/FS/GS):
    max(CPL, RPL) ≤ DPL

    • 允许高特权访问低 DPL 段(如内核 CPL=0 访问用户 DPL=3 数据)。
    • 禁止低特权访问高 DPL 段(如用户 CPL=3 访问内核 DPL=0 数据)。
    • RPL 机制防止内核滥用权限:即使 CPL=0,若 RPL=3,则无法访问 DPL=0 段。
  • 栈段特殊规则(SS):
    CPL == RPL == DPL

    • 确保栈的完整性,防止特权切换时栈被污染。
(2)代码段跳转
  • 非一致代码段(C=0):
    CPL == DPL

    • 仅允许平级跳转。
    • 跳转成功后,CS.RPL 被设为 DPL → CPL 更新为 DPL。
    • 高→低或低→高跳转均被禁止(除非通过门)。
  • 一致代码段(C=1):
    CPL ≥ DPL

    • 允许低特权代码跳入高 DPL 段(如用户调用共享系统库)。
    • 跳转后 CS.RPL 保持原 CPL → CPL 不变。
    • 无法执行特权指令(因 CPL 未提升)。

四、特权级切换的受控机制

1. 特权级提升(CPL 数值变小)
  • 唯一合法路径:通过门描述符(调用门、中断门、陷阱门)。
  • 过程
    • CPU 自动从 TSS 获取新 SS:ESP,切换栈。
    • 保存旧上下文(SS:ESP, CS:EIP, EFLAGS)。
    • 新 CS.RPL = 目标代码段 DPL → CPL 更新。
  • 典型场景:系统调用、中断处理。
2. 特权级降级(CPL 数值变大)
  • 禁止直接跳转到低 DPL 非一致代码段。
  • 唯一合法路径iret 指令。
    • 从中断/系统调用返回时,CPU 从内核栈弹出用户态 CS:EIP。
    • CS 被恢复为用户选择子(RPL=3)→ CPL 更新为 3。
  • 安全意义:确保降级过程由操作系统完全控制。

五、初始 CPL 的建立

  • 实模式下 CS=0x0000,低 2 位为 0,但无特权含义。
  • 进入保护模式后,首条跳转指令(如 jmp 0x08:entry):
    • 选择子 0x08 的 RPL=0,指向 GDT 中 DPL=0 的代码段。
    • 跳转成功后,CS = 0x08 → CS.RPL = 0 → CPL = 0。
  • 此后所有权限检查均以 CS.RPL 为 CPL 来源。

六、设计哲学与安全意义

  1. 执行身份与访问权限统一:CPL = CS.RPL,确保“谁在执行”决定“能做什么”。
  2. 最小权限原则:DPL 作为资源门槛,RPL 防止权限提升滥用。
  3. 控制流完整性:特权切换必须通过可信路径(门、iret),防止任意跳转破坏安全边界。
  4. 性能与安全平衡:一致代码段允许共享只读代码,无需特权切换开销,但限制特权指令使用。

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

lcreek

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值