1. 虚拟内存与分页机制概述
虚拟内存是现代操作系统与处理器协同实现的核心抽象层,它使每个进程拥有独立的、连续的虚拟地址空间,而无需关心底层物理内存的碎片化与容量限制。分页机制是实现这一抽象的关键技术,通过固定大小的页(Page)与页帧(Frame)映射,将虚拟地址转换为物理地址。
1.1 虚拟地址空间与物理地址空间
虚拟地址空间是进程看到的逻辑地址范围,物理地址空间是硬件可寻址的实际内存范围。两者通过页表建立映射关系。
| 特性 | 虚拟地址空间 | 物理地址空间 |
|---|---|---|
| 定义 | 进程可访问的逻辑地址集合 | 硬件内存总线上的实际地址集合 |
| 大小 | 由处理器地址位宽决定(如 48 位 → 256 TB) | 由物理内存容量决定(如 32 GB) |
| 连续性 | 对进程呈现连续线性空间 | 可能存在碎片,页帧不连续 |
| 隔离性 | 每个进程独立,互不干扰 | 全局共享,由 OS 管理分配 |
| 映射方式 | 通过页表转换为物理地址 | 直接对应 DRAM 或 MMIO 区域 |
关键概念:虚拟地址空间的大小通常远大于物理内存容量,这使得进程可以预留大块地址区域(如栈、堆、内存映射文件),仅在真正访问时才分配物理页帧。
1.2 页表的作用与基本结构
页表是存储在内存中的数据结构,用于记录虚拟页号(VPN)到物理页帧号(PFN)的映射关系。每个进程拥有独立的页表,由操作系统维护,硬件 MMU 在地址转换时遍历页表。
页表的核心作用
- 地址转换:将虚拟地址中的虚拟页号转换为物理页帧号,结合页内偏移得到完整物理地址。
- 权限控制:每个页表项(PTE)包含读/写/执行权限位,实现进程隔离与保护。
- 状态管理:记录页是否在内存中(有效位)、是否被访问/修改(A/D 位),支持换页与写回策略。
- 共享支持:多个虚拟页可映射到同一物理页帧,实现共享内存与库映射。
页表项(PTE)基本结构
| 位域 | 宽度 | 说明 |
|---|---|---|
| PFN | 20-40 位 | 物理页帧号,指向物理内存中的页帧基址 |
| V | 1 位 | 有效位(Valid),表示该页是否在物理内存中 |
| R/W | 1 位 | 读写权限(Read/Write) |
| U/S | 1 位 | 用户/超级用户权限(User/Supervisor) |
| A | 1 位 | 访问位(Accessed),由硬件置位,OS 用于页面置换 |
| D | 1 位 | 脏位(Dirty),表示页内容已被修改 |
| Reserved | 若干位 | 保留给 OS 或未来扩展 |
设计要点:PTE 中的 A/D 位由硬件 MMU 在访问时自动置位,OS 通过定期扫描这些位来统计页访问热度,指导页面置换算法(如 LRU 近似实现)。
1.3 多级页表与地址转换流程
现代 64 位处理器采用多级页表结构(如 x86-64 的 4 级页表),以解决单级页表占用连续大块物理内存的问题。多级页表按需分配中间页目录,大幅降低内存开销。
多级页表的核心优势
- 按需分配:仅对实际使用的虚拟地址范围分配页目录/页表,稀疏地址空间下内存占用显著降低。
- 支持大页:通过跳过中间层级,支持 2MB/1GB 大页,减少 TLB 缺失。
- 共享中间层:多个进程可共享页目录上级结构(如内核映射部分)。
典型 4 级页表地址转换步骤
- 从虚拟地址中提取各级索引(L4、L3、L2、L1)和页内偏移。
- MMU 读取 CR3 寄存器(页表基址),找到 L4 页目录基址。
- 使用 L4 索引在 L4 页目录中查找下一级页目录的物理地址。
- 依次遍历 L3、L2、L1 页目录/页表,最终得到物理页帧号。
- 将物理页帧号与页内偏移拼接,形成完整物理地址。
性能陷阱:多级页表遍历需要多次内存访问(4 级页表需要 4 次),每次访问都可能触发 cache miss。硬件 MMU 通过 TLB(Translation Lookaside Buffer)缓存近期使用的页表项,是缓解此问题的关键机制。
1.4 硬件 MMU 的协同角色
内存管理单元(MMU)是处理器内部的硬件模块,负责自动执行页表遍历与地址转换。MMU 与 OS 的协同关系是系统性能与安全的关键。
| 职责 | 硬件 MMU | 操作系统 |
|---|---|---|
| 地址转换 | 自动遍历页表,生成物理地址 | 构建并维护页表数据结构 |
| TLB 管理 | 缓存近期 PTE,硬件自动填充 | TLB 失效(flush)处理(上下文切换时) |
| 异常处理 | 检测缺页、权限违例,触发异常 | 缺页处理程序、信号发送 |
| A/D 位管理 | 访问时自动置位 A/D 位 | 定期扫描 A/D 位,指导页面置换 |
| 大页支持 | 识别页表层级中的大页标记 | 分配大页并设置对应 PTE 标记 |
协同设计要点:MMU 的硬件遍历路径与 OS 的页表更新必须保持一致性。当 OS 修改页表(如解除映射、更改权限)后,必须执行 TLB 失效指令(如 x86 的
INVLPG 或 ARM 的 TLBI),否则 MMU 可能使用过时的 TLB 缓存,导致地址转换错误。