[导读] 本文从内存管理的发展历程角度层层递进,介绍 MMU 的诞生背景,工作机制。而忽略了具体处理器的具体实现细节,将 MMU 的工作原理从概念上比较清晰的梳理了一遍。 MMU 诞生之前:在传统的批处理系统如 DOS 系统,应用程序与操作系统在内存中的布局大致如下图:
如果我们一直是单任务处理,则不会有任何问题,也或者应用程序所需的内存总是非常小,则这种架构是不会有任何问题的。然而随着计算机科学技术的发展,所需解决的问题越来越复杂,单任务批处理已不能满足需求了。而且应用程序需要的内存量也越来越大。而且伴随着多任务同时处理的需求,这种技术架构已然不能满足需求了,早先的多任务处理系统是怎么运作的呢? 程序员将应用程序分段加载执行,但是分段是一个苦力活。而且死板枯燥。此时聪明的计算机科学家想到了好办法,提出来虚拟内存的思想。程序所需的内存可以远超物理内存的大小,将当前需要执行的留在内存中,而不需要执行的部分留在磁盘中,这样同时就可以满足多应用程序同时驻留内存能并发执行了。 从总体上而言,需要实现哪些大的策略呢?
这样,衍生而来的一些实现上的更具体的需求:
总之,在这样的背景下,MMU 应运而生,也由此可见,任何一项技术的发展壮大,都必然是需求驱动的。这是技术本身发展的客观规律。 内存管理的好处
内存管理实现总体策略从操作系统角度来看,虚拟内存的基本抽象由操作系统实现完成:
从应用程序角度来看,应用程序(往往是进程)所使用的地址是虚拟内存地址,从概念上就如下示意图所示,MMU 在操作系统的控制下负责将虚拟内存实际翻译成物理内存。 从而这样的机制,虚拟内存使得应用程序不用将其全部内容都一次性驻留在内存中执行:
MMU 以及 TLBMMU(Memory Management Unit)内存管理单元:
TLB(Translation Lookaside Buffer)转译后备缓冲器: 本质上是 MMU 用于虚拟地址到物理地址转换表的缓存 这样一种架构,其最终运行时目的,是为主要满足下面这样运行需求: 多进程并发同时并发运行在实际物理内存空间中,而 MMU 充当了一个至关重要的虚拟内存到物理内存的桥梁作用。 那么,这种框架具体从高层级的概念上是怎么做到的呢?事实上,是将物理内存采用分片管理的策略来实现的,那么,从实现的角度将有两种可选的策略:
固定大小区片机制通过这样一种概念上的策略,将物理内存分成固定等大小的片:
这种策略实现,其优势在于简易,切换快速。但是该策略也带来明显的劣势:
可变大小分区机制内存被划分为可变大小的区块进行映射交换管理:
那么这种策略其优势在于没有内部内存碎片,分配刚好够进程所需的大小。但是劣势在于,在加载和卸载的动态过程中会产生碎片。 分页机制分页机制采用在虚拟内存空间以及物理内存空间都使用固定大小的分区进行映射管理。
分页机制是如何寻址的呢?这里介绍的设计理念,具体的处理器实现各有细微差异:
举个栗子,如下图所示: 还没有查到具体的物理地址,憋急,再看一下完整解析示例: 如何管理页表对于 32 位地址空间而言,假定 4K 为分页大小,则页表的大小为 100MB,这对于页表的查询而言是一个很大的开销。那么如何减小这种开销呢?实际运行过程中发现,事实上只需要映射实际使用的很小一部分地址空间。那么在一级页机制基础上,延伸出多级页表机制。 以二级分页机制为例: 单级页表已然有不小的开销,查询页表以及取数,而二级分页机制,因为需要查询两次页表,则将这种开销再加一倍。那么如何提高效率呢?其实前面提到一个概念一直还没有深入描述 TLB,将翻译工作由硬件缓存 cache,这就是 TLB 存在的意义。
TLB 加载谁负责加载 TLB 呢?这里可供选择的有两种策略:
总结一下本文授权转载自公众号“嵌入式客栈”,作者逸珺 |
|
来自: 西北望msm66g9f > 《编程》