内存映射与驱动测试:MMU配置与DMA缓冲区验证方法 - 第1节
1.1 内存管理单元(MMU)的核心作用
MMU(Memory Management Unit)是嵌入在 CPU 内部或作为协处理器的硬件单元,负责将 CPU 发出的虚拟地址(VA)实时转换为物理内存的物理地址(PA)。没有 MMU,所有程序直接操作物理地址,系统无法实现进程隔离、内存保护和虚拟内存。
MMU 三大核心职责:
- 地址转换:将虚拟地址映射到物理地址,使每个进程拥有独立的地址空间。
- 权限控制:通过页表项中的权限位(读/写/执行/用户/内核)阻止非法访问。
- 缓存管理:配合 TLB(Translation Lookaside Buffer)加速地址转换,减少页表遍历开销。
1.2 虚拟地址与物理地址映射机制
虚拟地址空间被划分为固定大小的页(Page),物理内存被划分为相同大小的页框(Page Frame)。MMU 通过页表将虚拟页号(VPN)映射到物理页框号(PFN),页内偏移保持不变。
关键公式: 虚拟地址 = VPN(高位) + Offset(低位) → 物理地址 = PFN(高位) + Offset(低位)。页内偏移在转换前后不变。
| 概念 | 说明 | 典型值(ARMv8) |
|---|---|---|
| 虚拟地址(VA) | 程序看到的地址,每个进程独立 | 48 位(256 TB 空间) |
| 物理地址(PA) | 实际硬件内存地址 | 48 位(256 TB 空间) |
| 页大小 | 映射的最小粒度 | 4 KB(标准)/ 64 KB(大页) |
| 页表项(PTE) | 存储 PFN 和权限位 | 8 字节(64 位) |
| 映射方式 | 一对一、多对一、一对多 | 多对一(共享内存) |
1.3 页表结构与多级页表
现代 32/64 位系统的虚拟地址空间极大,若使用单级页表会占用过多物理内存。因此采用多级页表结构,按需分配页表层级,节省内存。以 ARMv8-A 的 4 级页表为例:
- L0 页表:覆盖整个地址空间,每个表项指向 L1 页表。
- L1 页表:进一步细分,指向 L2 页表。
- L2 页表:指向 L3 页表或大页(2 MB)。
- L3 页表:最终页表,指向 4 KB 物理页框。
注意: 多级页表虽然节省内存,但每次地址转换需要多次内存访问(每级一次)。TLB 的存在正是为了缓存最近使用的页表项,避免频繁的页表遍历。
1.4 TLB(转换后备缓冲器)概述
TLB 是 MMU 内部的高速缓存,专门存储最近使用的虚拟页号到物理页框号的映射关系。TLB 的命中率直接影响系统性能:
| TLB 特性 | 说明 | 典型值 |
|---|---|---|
| 容量 | 存储的页表项数量 | 32 ~ 1024 项 |
| 关联度 | 全相联 / 组相联 | 4 路组相联 |
| 命中延迟 | TLB 命中时的转换时间 | 1 ~ 2 个 CPU 周期 |
| 未命中延迟 | 需要遍历页表并更新 TLB | 10 ~ 100 个周期 |
| 刷新方式 | 上下文切换时需刷新 TLB | ASID 避免全局刷新 |
优化技巧: 使用大页(如 2 MB / 1 GB)可以减少页表层级,同时提高 TLB 覆盖范围,显著提升内存密集型应用的性能。
1.5 本章小结与关键概念对照
| 概念 | 作用 | 与驱动开发的关系 |
|---|---|---|
| MMU | 虚拟地址 → 物理地址转换 | 驱动必须使用 ioremap / dma_alloc_coherent 等 API 获取物理地址 |
| 页表 | 存储 VPN → PFN 映射关系 | 多级页表影响 DMA 缓冲区连续性的判断 |
| TLB | 加速地址转换的硬件缓存 | DMA 缓冲区需要 cache 一致性维护,避免 TLB 脏数据 |
| 虚拟地址 | 进程看到的地址 | 用户态驱动通过 mmap 映射物理内存 |
| 物理地址 | 硬件总线访问的地址 | DMA 控制器直接使用物理地址 |