Linux虚拟内存的实现结构
我们先从整体结构上看一下Linux对虚拟内存的实现结构,如图6.2所示。
图6.2 Linux虚存的实现结构
从图中可看到实现虚拟内存的组成模块。 其实现的原代码大部分放在/mm目录下。
1. 内存映射模块(mmap)—负责把磁盘文件的逻辑地址映射到虚拟地址,以及把虚拟地址映射到物理地址。
2.交换模块(swap)—负责控制内存内容的换入和换出,它通过交换机制,使得在物理内存的页面(RAM页)中保留有效的页 ,即从主存中淘汰最近没被访问的页,保存近来访问过的页。
3.核心内存管理模块(core)—负责核心内存管理功能,即对页的分配、回收、释放及请页处理等,这些功能将被别的内核子系统(如文件系统)使用。
4. 结构特定的模块—负责给各种硬件平台提供通用接口,这个模块通过执行命令来改变硬件MMU的虚拟地址映射,并在发生页错误时,提供了公用的方法来通知别的内核子系统。这个模块是实现虚拟内存的物理基础。
虚拟内存实现机制间的关系
Linux虚拟内存的实现需要各种机制的支持,因此,本章我们将对内存的初始化进行描述以后,围绕以下几种实现机制进行介绍:
·内存分配和回收机制
·地址映射机制
·缓存和刷新机制
·请页机制
·交换机制
·内存共享机制
这几种机制的关系如图6.5所示。
图6.5 虚存实现机制间
首先内存管理程序通过映射机制把用户程序的逻辑地址映射到物理地址,在用户程序运行时如果发现程序中要用的虚地址没有对应的物理内存时,就发出了请页要求①;如果有空闲的内存可供分配,就请求分配内存②(于是用到了内存的分配和回收),并把正在使用的物理页记录在页缓存中③(使用了缓存机制)。如果没有足够的内存可供分配,那么就调用交换机制,腾出一部分内存④⑤。另外在地址映射中要通过TLB(翻译后援存储器)来寻找物理页⑧;交换机制中也要用到交换缓存⑥,并且把物理页内容交换到交换文件中后也要修改页表来映射文件地址⑦。