1. 虚拟内存与分页机制概述

虚拟内存是现代操作系统与处理器协同实现的核心抽象层,它使每个进程拥有独立的、连续的虚拟地址空间,而无需关心底层物理内存的碎片化与容量限制。分页机制是实现这一抽象的关键技术,通过固定大小的页(Page)与页帧(Frame)映射,将虚拟地址转换为物理地址。

1.1 虚拟地址空间与物理地址空间

虚拟地址空间是进程看到的逻辑地址范围,物理地址空间是硬件可寻址的实际内存范围。两者通过页表建立映射关系。

特性 虚拟地址空间 物理地址空间
定义 进程可访问的逻辑地址集合 硬件内存总线上的实际地址集合
大小 由处理器地址位宽决定(如 48 位 → 256 TB) 由物理内存容量决定(如 32 GB)
连续性 对进程呈现连续线性空间 可能存在碎片,页帧不连续
隔离性 每个进程独立,互不干扰 全局共享,由 OS 管理分配
映射方式 通过页表转换为物理地址 直接对应 DRAM 或 MMIO 区域
关键概念:虚拟地址空间的大小通常远大于物理内存容量,这使得进程可以预留大块地址区域(如栈、堆、内存映射文件),仅在真正访问时才分配物理页帧。
虚拟地址空间与物理地址空间映射关系 虚拟地址空间 进程 A 页 0x0000 页 0x1000 页 0x2000 ... 页 0xF000 大小: 256 TB 连续、独立 页表映射 物理地址空间 DRAM / MMIO 页帧 0x0000 页帧 0x1000 页帧 0x2000 ... 页帧 0xF000 大小: 32 GB 非连续、共享 映射特点 • 虚拟页 → 物理页帧 • 页大小固定(4KB) • 映射粒度:单页 OS 职责 • 分配/回收物理页帧 • 维护页表映射关系

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 近似实现)。
页表项(PTE)位域布局 页表项(PTE)— 64 位示例 PFN (物理页帧号) — 36 位 V R/W U/S A D 保留位 PTE 位域功能说明 • PFN:物理页帧号,与虚拟页内偏移拼接得到物理地址 • V:有效位,0 表示缺页,触发 page fault 异常 • A/D:访问位/脏位,由 MMU 硬件置位,OS 用于页面置换与回写决策

1.3 多级页表与地址转换流程

现代 64 位处理器采用多级页表结构(如 x86-64 的 4 级页表),以解决单级页表占用连续大块物理内存的问题。多级页表按需分配中间页目录,大幅降低内存开销。

多级页表的核心优势

  • 按需分配:仅对实际使用的虚拟地址范围分配页目录/页表,稀疏地址空间下内存占用显著降低。
  • 支持大页:通过跳过中间层级,支持 2MB/1GB 大页,减少 TLB 缺失。
  • 共享中间层:多个进程可共享页目录上级结构(如内核映射部分)。

典型 4 级页表地址转换步骤

  1. 从虚拟地址中提取各级索引(L4、L3、L2、L1)和页内偏移。
  2. MMU 读取 CR3 寄存器(页表基址),找到 L4 页目录基址。
  3. 使用 L4 索引在 L4 页目录中查找下一级页目录的物理地址。
  4. 依次遍历 L3、L2、L1 页目录/页表,最终得到物理页帧号。
  5. 将物理页帧号与页内偏移拼接,形成完整物理地址。
性能陷阱:多级页表遍历需要多次内存访问(4 级页表需要 4 次),每次访问都可能触发 cache miss。硬件 MMU 通过 TLB(Translation Lookaside Buffer)缓存近期使用的页表项,是缓解此问题的关键机制。
4 级页表地址转换流程 虚拟地址分解:L4索引(9位) | L3索引(9位) | L2索引(9位) | L1索引(9位) | 页内偏移(12位) CR3 → L4 页目录 L3 页目录 L2 页目录 L1 页表 PFN 4 级页表遍历详解 1. MMU 从 CR3 寄存器获取 L4 页目录基址(物理地址) 2. 使用虚拟地址的 L4 索引(9 位)在 L4 页目录中查找 L3 页目录基址 3. 使用 L3 索引在 L3 页目录中查找 L2 页目录基址 4. 使用 L2 索引在 L2 页目录中查找 L1 页表基址 5. 使用 L1 索引在 L1 页表中查找物理页帧号(PFN) 6. PFN + 页内偏移(12 位)→ 完整物理地址

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 缓存,导致地址转换错误。
硬件 MMU 与 OS 协同工作流 CPU 核心 发出虚拟地址 硬件 MMU 页表遍历 + TLB 物理内存 数据/指令访问 缺页/权限异常 OS 异常处理 加载页 / 信号处理 更新页表 协同关键点 • MMU 负责快速路径(TLB 命中) • OS 负责慢速路径(缺页处理) • TLB 失效保证一致性

1.5 本章小结