1. MMU 基础概念:虚拟地址、物理地址、页表、TLB、转换粒度
MMU(Memory Management Unit,内存管理单元)是嵌入式系统中负责地址转换与内存保护的核心硬件模块。理解其基础概念是进行页表初始化与性能优化的前提。本节将逐一拆解虚拟地址、物理地址、页表、TLB 和转换粒度这五个关键要素。
1.1 虚拟地址与物理地址
| 概念 | 定义 | 特点 | 嵌入式典型范围 |
|---|---|---|---|
| 虚拟地址 (VA) | CPU 核心直接使用的地址空间,由 MMU 转换为物理地址 | 连续、隔离、可映射到任意物理位置 | 32-bit: 0x0000_0000 ~ 0xFFFF_FFFF 64-bit: 视具体架构 |
| 物理地址 (PA) | 实际访问内存或外设寄存器时使用的地址 | 反映真实硬件布局,可能不连续 | 取决于 SoC 内存映射,如 0x8000_0000 ~ 0x8FFF_FFFF |
关键理解:在 MMU 使能后,软件操作的是虚拟地址,硬件最终访问的是物理地址。页表就是这两者之间的映射字典。
1.2 页表 (Page Table)
页表是存储在内存中的多级数据结构,用于描述虚拟地址到物理地址的映射关系。每个页表项(PTE)包含物理页帧号、权限位、缓存属性等控制信息。
- 一级页表:适用于小地址空间,简单但占用连续大块内存。
- 多级页表:ARMv7-A 使用二级页表,ARMv8-A 使用四级页表,按需分配,节省内存。
- 页表项格式:包含物理基地址、访问权限(AP)、可缓存(C/B)、可共享(S)等位域。
1.3 TLB (Translation Lookaside Buffer)
TLB 是 MMU 内部的硬件缓存,用于缓存最近使用的页表项。由于页表查找涉及多次内存访问,TLB 命中可大幅降低地址转换延迟。
| TLB 状态 | 延迟(典型周期) | 影响 |
|---|---|---|
| TLB 命中 | 1 ~ 2 个 CPU 周期 | 几乎无性能损失 |
| TLB 未命中 | 数十 ~ 数百个周期 | 触发页表遍历(Page Walk),严重拖慢执行 |
优化要点:使用大页(如 2MB/1GB 页)可以减少页表级数,提高 TLB 覆盖范围,降低未命中率。这是嵌入式性能优化的核心手段之一。
1.4 转换粒度 (Translation Granule)
转换粒度指 MMU 支持的最小地址映射单元大小。不同架构支持不同粒度,常见的有:
- 4KB 页:最常用,粒度细,适合代码/数据段精细管理,但 TLB 覆盖范围小。
- 16KB / 64KB 页:ARMv8-A 可选,平衡粒度与 TLB 效率。
- 2MB / 1GB 块:大块映射,适合大内存区域(如 DDR、显存),TLB 覆盖范围极大。
1.5 概念关系总结
| 组件 | 位置 | 作用 | 性能影响 |
|---|---|---|---|
| 虚拟地址 | CPU 内部 | 程序视角的地址空间 | 决定寻址能力 |
| 物理地址 | 系统总线 | 实际访问内存/外设 | 决定硬件访问效率 |
| 页表 | 内存中 | 存储 VA→PA 映射 | 页表遍历延迟大 |
| TLB | MMU 内部 | 缓存页表项 | 命中时零延迟 |
| 转换粒度 | 页表配置 | 定义映射单元大小 | 影响 TLB 覆盖范围 |
常见误区:初学者常认为页表越大越好。实际上,过大的页表会占用宝贵的内存带宽,且 TLB 未命中时的遍历开销更大。合理选择转换粒度、使用大页映射连续区域,才是性能优化的正确方向。