| 项目 | 值 |
|---|---|
| 核心概念 | 内存保护机制 |
| 关键公式 | 物理地址 $=$ 基址 $+$ 逻辑地址 |
| 页表保护位 | R/W(读写)、U/S(用户/内核)、NX(不可执行) |
| 特权级规则 | $\max(CPL, RPL) \leq DPL$ |
内存保护确保每个进程只能访问自己的地址空间,防止进程间互相干扰和恶意访问。保护的目标:①进程不能访问其他进程的内存;②进程不能访问内核内存(除非通过系统调用);③防止缓冲区溢出等安全漏洞。
最简单的内存保护机制:
┌─────────────────────────────────┐
│ CPU │
│ ┌─────────┐ ┌─────────┐ │
│ │基址寄存器│ │界限寄存器│ │
│ │(Base) │ │(Limit) │ │
│ └────┬────┘ └────┬────┘ │
└───────┼────────────┼───────────┘
│ │
▼ ▼
物理地址 = 基址 + 逻辑地址
检查: 逻辑地址 ≤ 界限
物理内存:
┌─────────────────────────────────┐
│ 操作系统 │
├─────────────────────────────────┤ ← 基址=1000
│ 进程A │
│ (逻辑地址0~500) │
├─────────────────────────────────┤ ← 基址+界限=1500
│ 进程B │
└─────────────────────────────────┘
PTE结构: ┌──────────────────────────────────┐ │ 物理页框号(PFN) │ 保护位 │标志│ ├────────────────────┼───────┼───┤ │ │ R/W/X │P │ └────────────────────┴───────┴───┘
| 位 | 含义 |
|---|---|
| R | 可读 |
| W | 可写 |
| X | 可执行 |
| U/S | 用户 / 内核模式 |
段表项: ┌────────┬────────┬────────┬────────┐ │ 段基址 │ 段界限 │ 保护位 │ 其他 │ └────────┴────────┴────────┴────────┘
逻辑地址 → [段号|页号|偏移]
│
▼
段表查找 + 段保护检查
│
▼
页表查找 + 页保护检查
│
▼
物理地址
Ring 0 (内核态) ← 最高特权 Ring 1 (设备驱动) Ring 2 (设备驱动) Ring 3 (用户态) ← 最低特权
低特权级不能直接访问高特权级资源;系统调用提供从 Ring 3 到 Ring 0 的安全入口;调用门、中断门实现特权级切换。
| 缩写 | 含义 |
|---|---|
| CPL | 当前特权级(Current Privilege Level) |
| DPL | 目标特权级(Descriptor Privilege Level) |
| RPL | 请求特权级(Requested Privilege Level) |
| 异常 | 原因 | 处理 |
|---|---|---|
| 段错误(SIGSEGV) | 访问无效地址 | 终止进程 |
| 总线错误(SIGBUS) | 对齐错误 | 终止进程 |
| 页保护异常 | 写只读页 | COW 或终止 |
| 缺页异常 | 页不在内存 | 从磁盘加载 |
↑ 以上为站内 HTML 相对链接(纯网页可浏览);本页右上「在 Obsidian 中打开」跳回源笔记。