10张图详解MMU那些事儿

💡 原文中文,约3800字,阅读约需9分钟。
📝

内容提要

本文介绍了Linux下内存管理和进程调度的重要性,以及MMU的诞生背景和工作原理。讨论了内存管理的好处、实现策略和分区机制的优劣势,以及MMU和TLB的作用。以易懂的方式描述了MMU的工作机理。

🔎

延伸解读

从分区到分页:内存管理机制的演进逻辑

文章梳理了固定分区、可变分区到分页机制的演进。固定分区实现简单、切换快,但存在内部碎片;可变分区无内部碎片,却会在动态加载卸载中产生外部碎片。分页机制在虚拟和物理空间都使用固定大小分区,隐藏了物理内存分散的实现细节,从而兼顾了灵活性与效率。这一演进体现了在碎片控制与管理复杂度之间的权衡。

多级页表与TLB:用缓存弥补翻译开销

32位地址空间下,4K分页的页表可达100MB,查询开销很大。多级页表虽减少了页表本身的空间占用,但增加了查询次数,使翻译开销翻倍。TLB作为MMU的缓存,将虚拟页到PTE的翻译结果缓存起来,可在单周期指令内完成转换,从而显著提升地址翻译效率。这揭示了硬件缓存对虚拟内存性能的关键作用。

TLB加载策略:灵活性与硬件依赖的取舍

TLB的加载可由操作系统或MMU硬件负责。操作系统加载时,由OS找到PTE并填入TLB,格式灵活;硬件加载时,OS维护页表,MMU直接访问,但页表格式严格依赖硬件设计。两种策略反映了软件灵活性与硬件效率之间的不同侧重,也说明内存管理是软硬件协同的设计领域。

❓

Q&A

MMU是什么?它的主要作用是什么?

MMU(内存管理单元)是一种硬件电路单元,负责将虚拟内存地址转换为物理内存地址。所有内存访问都将通过MMU进行转换,除非没有使能MMU。

TLB在内存管理中起什么作用?

TLB(转译后备缓冲器)本质上是MMU用于虚拟地址到物理地址转换表的缓存,可以加速地址转换。TLB将虚拟页翻译成PTE,这个工作可在单周期指令完成。

固定大小分区机制和可变大小分区机制各有什么优缺点?

固定大小分区机制简单、切换快速,但存在内部碎片问题,且一种分区大小不能满足所有应用进程所需。可变大小分区机制没有内部碎片,分配刚好够进程所需的大小,但在加载和卸载的动态过程中会产生外部碎片。

分页机制是如何工作的?

分页机制在虚拟内存空间和物理内存空间都使用固定大小的分区进行映射管理。虚拟地址包含虚拟页序号VPN和偏移量,VPN是页表的索引,页表维护页框号PFN,物理地址由PFN和偏移量组合而成。这种映射关系对应用程序不可见,隐藏了实现细节。

为什么需要多级页表?

对于32位地址空间,假定4K为分页大小,页表的大小为100MB,查询开销很大。实际运行中只需要映射实际使用的很小一部分地址空间,因此在一级页机制基础上延伸出多级页表机制来减小开销。

TLB的加载由谁负责?有哪些策略?

TLB的加载有两种策略:由操作系统加载,操作系统找到对应的PTE后加载到TLB,格式比较灵活;或者由MMU硬件负责,操作系统维护页表,MMU直接访问页表,页表格式严格依赖硬件设计格式。

🏷️

标签

➡️

继续阅读