1. 内存管理概述:物理内存与虚拟内存的概念、MMU的作用、页表与地址转换基础
1.1 物理内存与虚拟内存
操作系统内存管理的核心目标是让多个进程安全、高效地共享有限的物理内存资源。为此,现代操作系统普遍引入了虚拟内存的概念,为每个进程提供一个独立的、连续的、远大于物理内存的地址空间。
| 概念 | 定义 | 特点 |
|---|---|---|
| 物理内存 | 硬件实际提供的 RAM(随机存取存储器),由物理地址(Physical Address, PA)直接寻址。 | 容量有限、所有进程共享、地址不连续(碎片化)。 |
| 虚拟内存 | 操作系统为每个进程抽象出的逻辑地址空间,由虚拟地址(Virtual Address, VA)寻址。 | 容量大(如 64 位系统可达 2^64 字节)、每个进程独立、地址连续、部分数据可暂存于磁盘。 |
核心洞察: 虚拟内存让每个进程“以为”自己独占整个内存空间(如 0x00000000 ~ 0xFFFFFFFF),从而简化了编程模型,并提供了进程隔离与内存保护。
1.2 MMU:地址转换的硬件引擎
内存管理单元(Memory Management Unit, MMU)是 CPU 内部负责将虚拟地址转换为物理地址的硬件模块。它是虚拟内存机制得以高效实现的基石。
MMU 核心职责:
- 地址转换: 将 CPU 发出的虚拟地址实时转换为物理地址。
- 权限检查: 检查当前访问是否合法(读/写/执行权限、用户态/内核态)。
- 缓存管理: 管理 TLB(Translation Lookaside Buffer,页表缓存),加速转换过程。
1.3 页表与地址转换基础
页表是操作系统维护的、用于记录虚拟页到物理页帧映射关系的数据结构。MMU 通过查找页表完成地址转换。
1.3.1 分页机制
- 页(Page): 虚拟地址空间被划分为固定大小的块,通常为 4KB。
- 页帧(Page Frame): 物理内存被划分为同样大小的块。
- 页表项(PTE): 页表中的每一行,包含物理页帧号、权限位、存在位、脏位等元数据。
1.3.2 地址转换公式
虚拟地址 (VA) = 虚拟页号 (VPN) + 页内偏移 (Offset)
物理地址 (PA) = 物理页帧号 (PFN) + 页内偏移 (Offset)
转换过程:
1. 从 VA 中提取 VPN 和 Offset。
2. MMU 以 VPN 为索引,在页表中查找对应的 PTE。
3. 从 PTE 中提取 PFN。
4. 拼接 PFN 和 Offset,得到最终的 PA。
1.3.3 多级页表
为节省页表占用的连续物理内存,现代 64 位架构普遍采用多级页表(如 x86_64 的 4 级页表)。只有实际使用的虚拟地址范围才会分配页表层级,未使用的区域不占用内存。
| 层级 | 名称 | 作用 |
|---|---|---|
| L1 | PML4(Page Map Level 4) | 顶级页表,覆盖整个 48 位地址空间 |
| L2 | PDPT(Page Directory Pointer Table) | 二级页表,指向页目录 |
| L3 | PD(Page Directory) | 三级页表,指向页表 |
| L4 | PT(Page Table) | 四级页表,包含最终的 PTE |
关键注意: 页表本身也存储在物理内存中。每次地址转换都需要多次内存访问(多级页表遍历),因此 TLB 的缓存命中率对性能至关重要。缺页异常(Page Fault)发生在 PTE 的“存在位”为 0 时,此时需要操作系统介入处理。
1.4 本章小结
- 物理内存是硬件资源,虚拟内存是操作系统提供的抽象,两者通过 MMU 和页表建立映射。
- MMU 负责实时地址转换和权限检查,TLB 是其关键加速组件。
- 页表是分页机制的核心数据结构,多级页表在 64 位系统中节省了大量内存。
- 理解地址转换是后续学习 VMA(虚拟内存区域)和缺页中断处理的基础。