572 字
3 分钟
TLB、多级页表和虚拟地址转换是怎么工作的
分页系统把虚拟地址拆成虚拟页号和页内偏移。MMU 根据页号查映射得到物理页框号,再将页框号与原偏移拼成物理地址。页表项还可包含有效位、读写执行权限、用户/内核权限、访问位和脏位等信息;具体位布局由架构决定。
每次都遍历内存中的页表会很慢,因此处理器使用 TLB 缓存近期地址转换。TLB 命中时可快速取得页框映射;未命中时硬件或内核按架构规则遍历页表,再把结果放入 TLB。TLB miss 不等于缺页:如果页表项有效,遍历后即可继续;只有映射缺失或权限检查失败才需要异常处理。
大地址空间若使用单层页表会非常庞大。多级页表把虚拟页号拆成多段索引,逐级索引页表页,只为实际使用的地址区域分配下级页表,节省稀疏地址空间的内存。代价是 TLB 未命中时需要多次内存访问,因此处理器还可能使用页表遍历缓存或大页减少转换压力。
地址映射不仅是“找到物理页”。内核必须检查访问权限;例如尝试写入只读页可能触发保护异常,内核若识别为写时复制则会复制页面并更新映射,否则会向进程报告错误。修改映射后还要按架构规则维护 TLB 一致性。
常见追问
Q:TLB miss 和 page fault 是一回事吗?
A:不是。TLB miss 是转换缓存未命中,页表中可能仍有有效映射;page fault 是页表状态或权限要求引发的异常,需要内核处理。
Q:页表为什么做成多级?
A:大而稀疏的虚拟地址空间若使用平坦页表会浪费大量内存;多级结构只为实际映射区域分配下级页表页,但增加了未命中时的遍历步骤。
Q:页内偏移为什么不变?
A:虚拟页和物理页框大小相同,映射仅替换页号部分;页内位置在页框中对应同一偏移。
TLB、多级页表和虚拟地址转换是怎么工作的
https://blog.xqcherry.top/posts/interview/operating-system/tlb-page-table-address-translation/ 目录