基本内容
MMU(Memory Management Unit),即内存管理单元,是现代CPU架构中不可或缺的一部分。
- MMU主要包含以下几个功能:
- 虚实地址翻译
在用户访问内存时,将用户访问的虚拟地址翻译为实际的物理地址,以便CPU对实际的物理地址进行访问。 - 访问权限控制
可以对一些虚拟地址进行访问权限控制,以便于对用户程序的访问权限和范围进行管理,如代码段一般设置为只读,如果有用户程序对代码段进行写操作,系统会触发异常。 - 引申的物理内存管理
对系统的物理内存资源进行管理,为用户程序提供物理内存的申请、释放等操作接口。
- 虚实地址翻译
- 使用MMU带来的好处或者优势:
- 提升物理内存的利用率
物理内存按需申请,如代码段的内存在执行时进行映射和转换,进程fork后,通过写时复制(Copy-On-Write)进行真正的物理内存分配。解决内存管理碎片化的问题,即在系统运行一段时间后,频繁的内存申请和释放会导致内存碎片化,无法申请到一块足够大的地址连续的内存。 - 对内存地址的访问进行控制
如上述代码段只读权限控制,多线程的栈内存之间的空洞页隔离可以防止栈溢出后改写其他线程的栈内存,不同进程之间的地址隔离等等。 - 将进程的地址空间隔离
不同进程之间可以使用相同的虚拟内存地址空间,而进程间的物理内存又可以做到隔离,这保证了进程的独立性同时,又简化了地址的访问方式,如在早期32位CPU上,为了支持4G以上的物理内存,一般物理地址有36-bit(如PowerPC-604系列),但是用户的虚地址仍然使用32-bit,做法就是将用户的不同进程的32-bit虚地址在MMU转换时,转换为36-bit的物理地址,这样每个进程仍然能访问0-3G虚地址范围,将多个进程的3G空间映射到36-bit的物理内存空间中去。
- 提升物理内存的利用率
现代MMU的实现
-
现在CPU的MMU地址转换流程如下:
-
主要分为几个阶段:
- 用户进程访问虚存地址。
- 触发TLB查找过程,该部分通过硬件完成(灰色背景),没有软件参与。
- TLB miss场景下,查找PTE(粉色背景),该部分在不同CPU上实现不同,像X86都是硬件查找,PowerPC有些处理器使用软件查找,即在内核实现一个TLB miss的异常处理,可以灵活做到TLB查找。
- Do Page Fault,分为几种情况:
新申请内存第一次读写,触发物理内存分配;进程fork后子进程写内存触发Copy-On-Write;非法内存读写,错误处理。