分页、页表、MMU 与地址转换是怎么配合的
理解虚拟内存之后,下一步就要回答一个更具体的问题:
程序拿到一个虚拟地址之后,到底是怎么一步步变成物理地址的?
这背后主要依赖分页、页表、MMU 和 TLB 这些机制配合完成。
一、为什么需要分页
如果要求一个进程始终使用连续物理内存,会带来外部碎片严重、分配不灵活等问题。
所以现代操作系统通常采用分页机制:
- 把虚拟地址空间切成固定大小的页
- 把物理内存切成同样大小的页框
这样,一个进程的内容可以分散放在多个物理页框中,而不要求整块连续物理空间。
二、页和页框分别是什么
1. 页
页是虚拟地址空间中的固定大小单元。
2. 页框
页框是物理内存中的固定大小单元。
二者大小通常相同,常见页大小比如 4KB。操作系统通过页表把虚拟页映射到物理页框。
三、页表的作用是什么
页表本质上就是:
记录虚拟页号到物理页框号映射关系的一张表。
访问内存时,系统需要先知道当前虚拟页映射到了哪个物理页框,再加上页内偏移,才能得到最终物理地址。
四、虚拟地址怎么拆
一个虚拟地址通常可以拆成两部分:
- 页号
- 页内偏移
如果页大小是 4KB,也就是 2^12 字节,那么低 12 位通常就是页内偏移,高位部分就是页号。
地址转换过程大致可以理解成:
- 用页号查页表,找到对应页框号
- 用页框号加页内偏移,拼出物理地址
五、MMU 是什么
MMU 全称是 Memory Management Unit,即内存管理单元。
它是硬件中的地址转换执行者,负责把 CPU 发出的虚拟地址翻译成物理地址。
可以简单理解成:
- 页表是映射关系的数据
- MMU 是执行地址翻译的硬件单元
六、为什么还需要 TLB
如果每次访存都先去内存里查页表,再去访问真正的数据,代价会比较高。
所以硬件会额外引入 TLB,缓存常用页表项。这样在 TLB 命中时,可以直接拿到物理页框号,避免每次都查页表。
这也是为什么 TLB 对地址转换性能影响很大。
七、TLB miss 和缺页中断不是一回事
这是很容易混的点。
1. TLB miss
TLB miss 只是说明:
地址映射缓存里没有命中。
这时还需要继续去查页表。
2. 缺页中断
缺页中断说明的是:
页表进一步表明该页当前不在物理内存中。
所以流程应该是:
- 先查 TLB
- TLB miss 再查页表
- 只有页表显示页不在内存中时,才会触发缺页中断
因此:
TLB miss 不一定会导致缺页中断。
八、地址转换的大致流程
CPU 访问一个虚拟地址时,大致会经历下面几步:
- CPU 产生虚拟地址
- MMU 先查 TLB
- 如果 TLB 命中,直接得到物理页框号
- 如果 TLB 未命中,再去查页表
- 如果页表显示页在内存中,更新 TLB 后继续访问
- 如果页表显示页不在内存中,触发缺页中断,由操作系统调页处理
九、总结
分页把虚拟地址空间和物理内存都划分成固定大小的页和页框,页表负责记录虚拟页到物理页框的映射关系,MMU 负责执行地址翻译,TLB 用来缓存常用页表项以加速转换。访问一个虚拟地址时,并不是直接得到物理地址,而是先经过 TLB 和页表这条链路。需要注意的是,TLB miss 只代表缓存未命中,不等于缺页;只有页表进一步表明该页不在内存中时,才会触发缺页中断。
