内存映射与驱动测试:MMU配置与DMA缓冲区验证方法 - 第1节

1.1 内存管理单元(MMU)的核心作用

MMU(Memory Management Unit)是嵌入在 CPU 内部或作为协处理器的硬件单元,负责将 CPU 发出的虚拟地址(VA)实时转换为物理内存的物理地址(PA)。没有 MMU,所有程序直接操作物理地址,系统无法实现进程隔离、内存保护和虚拟内存。

MMU 三大核心职责:
  • 地址转换:将虚拟地址映射到物理地址,使每个进程拥有独立的地址空间。
  • 权限控制:通过页表项中的权限位(读/写/执行/用户/内核)阻止非法访问。
  • 缓存管理:配合 TLB(Translation Lookaside Buffer)加速地址转换,减少页表遍历开销。
MMU 在系统中的位置与地址转换流程 CPU 核心 MMU TLB 缓存 物理内存 页表(主存) 虚拟地址 物理地址 查页表(TLB未命中) 转换过程 ① CPU 发出 VA ② MMU 查 TLB ③ 命中 → 直接转换 ④ 未命中 → 查页表 ⑤ 返回 PA 并更新 TLB

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 位)
映射方式一对一、多对一、一对多多对一(共享内存)
虚拟地址到物理地址的映射示例(4 KB 页) 虚拟地址空间 VPN=0x01, Offset=0xABC VPN=0x02, Offset=0x123 ... 页表映射 物理地址空间 PFN=0x10, Offset=0xABC PFN=0x20, Offset=0x123 ... 页表映射关系 VPN=0x01 → PFN=0x10 VPN=0x02 → PFN=0x20 Offset 保持不变 物理地址 = PFN << 12 | Offset

1.3 页表结构与多级页表

现代 32/64 位系统的虚拟地址空间极大,若使用单级页表会占用过多物理内存。因此采用多级页表结构,按需分配页表层级,节省内存。以 ARMv8-A 的 4 级页表为例:

  • L0 页表:覆盖整个地址空间,每个表项指向 L1 页表。
  • L1 页表:进一步细分,指向 L2 页表。
  • L2 页表:指向 L3 页表或大页(2 MB)。
  • L3 页表:最终页表,指向 4 KB 物理页框。
注意: 多级页表虽然节省内存,但每次地址转换需要多次内存访问(每级一次)。TLB 的存在正是为了缓存最近使用的页表项,避免频繁的页表遍历。
ARMv8-A 4 级页表结构 L0 页表 L1 页表 L2 页表 L3 页表 物理页框 虚拟地址分解:L0索引(9bit) | L1索引(9bit) | L2索引(9bit) | L3索引(9bit) | 页内偏移(12bit) 每级页表 512 项,每项 8 字节,共 4 KB

1.4 TLB(转换后备缓冲器)概述

TLB 是 MMU 内部的高速缓存,专门存储最近使用的虚拟页号到物理页框号的映射关系。TLB 的命中率直接影响系统性能:

TLB 特性说明典型值
容量存储的页表项数量32 ~ 1024 项
关联度全相联 / 组相联4 路组相联
命中延迟TLB 命中时的转换时间1 ~ 2 个 CPU 周期
未命中延迟需要遍历页表并更新 TLB10 ~ 100 个周期
刷新方式上下文切换时需刷新 TLBASID 避免全局刷新
优化技巧: 使用大页(如 2 MB / 1 GB)可以减少页表层级,同时提高 TLB 覆盖范围,显著提升内存密集型应用的性能。
TLB 命中与未命中处理流程 虚拟地址 VA TLB 查询 TLB 命中 TLB 未命中 物理地址 PA 遍历页表 更新 TLB 项

1.5 本章小结与关键概念对照

概念作用与驱动开发的关系
MMU虚拟地址 → 物理地址转换驱动必须使用 ioremap / dma_alloc_coherent 等 API 获取物理地址
页表存储 VPN → PFN 映射关系多级页表影响 DMA 缓冲区连续性的判断
TLB加速地址转换的硬件缓存DMA 缓冲区需要 cache 一致性维护,避免 TLB 脏数据
虚拟地址进程看到的地址用户态驱动通过 mmap 映射物理内存
物理地址硬件总线访问的地址DMA 控制器直接使用物理地址