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

被折叠的 条评论
为什么被折叠?



