MMU 与 TLB:虚拟地址是怎么变成物理地址的
更新时间:2026-09-12。本文是「集成电路大类 · 芯片设计」**进阶层(intermediate)**数字逻辑第一百零七篇。跑 Linux 的核(ARM Cortex-A、RISC-V RV39/64)看到的地址不是真实内存地址,而要经过 MMU 翻译。理解它,就把前面的存储层次、缓存组织和处理器异常串成了「程序实际怎么访问内存」的完整图景。
本文要回答的问题
- 为什么要虚拟地址?它给进程隔离和内存管理带来什么?
- 地址被切成「页号 + 偏移」,哪部分要翻译、哪部分不变?
- 页表项里除了物理页号还有哪些控制位?多级页表省什么?
- 每次访存都查页表岂不是慢好几倍?TLB 怎么救?
- TLB 缺失、缺页异常、上下文切换时硬件和软件各做什么?
一、分页:VPN + 偏移
地址空间被切成固定大小的页(通常 4KB)。虚拟地址 = 虚拟页号 VPN + 页内偏移 offset;物理地址 = 物理页帧号 PFN + 同一 offset。翻译只作用在高位页号上,低 12 位偏移原样保留(页内连续映射到同一物理帧)。
一张页表就是以 VPN 为索引的数组,每项 PTE 给出 PFN(映射到哪个物理帧)+ 控制位:有效位 V(是否在内存)、读/写/执行权限 R/W/X、用户/内核 U、脏位 D、访问位 A 等。无效或越权访问会触发异常交给 OS。
二、多级页表与遍历
一张覆盖全 64 位空间的单级页表会大到无法接受。多级页表把 VPN 再切成几段,逐级当索引:RISC-V SV39 把 VPN 分三段查三级页表(Sv32 两级),上级表项指向下级表的物理基址;没用到的大片地址区域其下级表根本不分配,省下绝大部分空间。完整翻译(page-table walk)要顺序访问 2~4 次内存,非常慢。
三、TLB:页表翻译的缓存
绝大多数程序反复访问少数页面,于是把最近的 VPN→PFN 翻译缓存进 TLB(Translation Lookaside Buffer),它是一个小型相联查找表/CAM:
- TLB 命中:一拍用 VPN 并行查到 PFN,拼上 offset 直接得物理地址,同时检查权限;
- TLB 缺失:硬件(复杂核的页表遍历器 PTW)或软件(异常处理)走多级页表补齐,再重试访存;遍历要把中间级也填入 TLB。
典型层级:指令/数据各有 L1 TLB(很小、全相联/组相联)→ 统一 L2 TLB(更大)。TLB 命中是常态,缺失代价是几十~上百周期,因此 TLB 大小和**巨页(2MB/1GB 大页,一项覆盖更大范围)**对性能影响明显。
四、缺页、权限与上下文切换
- 缺页 page fault:PTE 有效位为 0(页面被换到磁盘/还没分配),触发异常进 OS,OS 把页换入/分配一个物理帧、填好 PTE,返回后指令重新执行——DRAM「不够」却能跑大程序的虚拟内存正建立在此;
- 权限异常:写只读页、用户态访问内核页、执行不可执行页都触发 fault,是进程隔离和安全的硬件基础;
- 上下文切换:换进程后同样的虚拟地址指向不同物理页,旧 TLB 翻译失效。靠在 PTE/TLB 项里加 **ASID(地址空间标识)**区分进程可避免全部清空,否则切换时刷 TLB(RISC-V 用
sfence.vma); - MMU 使每个进程拥有私有、连续、可超额订阅的虚拟空间,OS 才能做进程隔离、swap、内存映射文件和共享库。
五、与缓存、流水线的关系
翻译在访存前发生,和缓存查找的时序要一起设计:物理索引物理标记 PIPT 最稳但等翻译;虚拟索引物理标记 VIPT 让按 offset+低位索引缓存与 TLB 并行(受页大小/别名约束)。TLB 缺失和缺页作为异常进入流水线控制,要保存出错 PC(RISC-V stval/sepc)、冲刷后续指令。页表基址由寄存器给出(RISC-V satp,ARM TTBR),开启 MMU 即进入虚拟地址模式。
与现有篇目的衔接
总结
一句话总结:MMU 在每次访存时把进程使用的虚拟地址翻译成物理地址并做权限校验,地址被切成高位虚拟页号和低 12 位页内偏移,只有页号参与翻译、偏移原样保留;页表是以虚拟页号为索引的数组,每项给出物理页帧号和有效、读写执行、用户/内核、脏、访问等控制位,多级页表(如 RISC-V SV39 三级)只给实际使用的区域分配下级表从而避免全空间单级表过大,而一次遍历要访问多次内存,因此用 TLB 这个小容量相联查找缓存最近的页号到帧号翻译,命中时一拍出物理地址、缺失则由硬件遍历器或软件异常补齐并回填;当有效位为 0 时触发缺页异常由 OS 换入或分配物理帧后重执指令,越权访问触发保护异常,进程切换时靠 ASID 区分地址空间或刷新 TLB;由此每个进程获得私有、连续且可超额订阅的空间,支撑进程隔离、swap、内存映射文件和共享库;时序上 MMU 与缓存协同,VIPT 让缓存索引与 TLB 查找并行、PIPT 最直观,TLB 缺失和缺页还作为异常接入流水线冲刷与错误 PC 保存机制。