计算机底层知识拾遗(九)深入理解内存映射mmap

内存映射mmap是Linux内核的一个重要机制,它和虚拟内存管理以及文件IO都有直接的关系,这篇细说一下mmap的一些要点。

mmap和虚拟内存管理

先来看看Linux内核的用户进程虚拟内存管理。内核定义了mm_struct结构来表示一个用户进程的虚拟内存地址空间。

1. start_code, end_code指定了进程的代码段的边界,start_data, end_data指定了进程数据段的边界。在ELF二进制文件映射到虚拟内存地址空间后,这几个长度就不会再改变

2. start_brk, brk指定了堆的边界。start_brk表示堆的起始地址,在进程整个生命周期不会改变,brk表示堆的结束位置,会随着堆的长度改变而改变

3. stack_top指定了栈的起始位置,一般是

4. task_size指定了用户进程地址空间的长度,也就是用户进程地址空间的顶部边界

5. mmap_base指定了用户进程虚拟地址空间中用作内存映射部分的地址的基地址,这个位置不是随机的,通常是TASK_SIZE / 3位置处

这里各个区域的地址都是用户进程的虚拟地址,用户进程使用虚拟地址和页表结构来访问内存

1. 首先根据所在区域的虚拟地址转换成对应的页表数组的数组项索引,找到页表索引最后定为到PTE中保存的物理内存页的页号,加上虚拟地址低12位的offset来确定一个唯一的物理内存地址

2. 如果物理内存地址所在的页存在,就返回该物理地址存放的内容。如果不存在就触发缺页异常。虚拟内存管理采用按需分配 + 缺页异常机制来管理页表项和分配对应的物理内存页。当一个虚拟地址对应的页表项不存在时,先创建页表结构,再分配物理内存页,再修改页表

进程的mm_struct除了包含虚拟内存地址空间布局的信息,还包含了虚拟内存区域vm_area_struct的信息。虚拟内存区域vm_area_struct是内核管理用户进程虚拟地址空间的方式,实际上数据段,文本段,共享库这些都是通过vm_area_struct来管理的

vm_area_struct由两种组织形式,一种是单链表,包含了所有创建的vm_area_struct实例,一种是红黑树结构,加速区域的查找。这两个数据结构都是面向同一份vm_area_struct实例,,只是组织形式不同。

再考虑一下vm_area_struct和页表的关系,vm_area_struct本质上是一段用户进程的虚拟地址,而我们知道虚拟地址和页表数组的索引是对应的,页表数组的最后一级PTE数组的数组项存放着物理内存页的页号,这样就建立了虚拟内存地址到物理内存地址的对应关系。

1. 有一种情况是先有虚拟地址,再由访问虚拟地址引起缺页异常去加载物理内存,再更新页表建立虚拟地址,页表,物理内存三者的联系

2. 有一种情况(mmap)是先从设备加载文件,建立address_space,页缓存(物理内存),再创建vm_area_struct结构,更新页表,返回虚拟地址。

vm_area_struct的结构体如下

1. vm_start, vm_end表示区域的开始位置和结束位置,确定了区域的边界。两个vm_area_struct不会出现交叉的情况

2. vm_page_prot 表示这个区域的页的访问权限

3. shared结构处理有后备文件的内存映射,和后备文件的address_space地址空间关联起来

4. anon_vma_node, anon_vma处理匿名文件共享内存映射的情况,映射到同一物理内存页的映射都保存在一个链表中

5. vm_pgoff, vm_file都是处理有后备文件内存映射的情况,获得该映射在文件的页偏移量,以及打开文件file实例的信息

对于有后备文件的映射,内核还提供了一个优先查找树结构,来加速确定一个文件和所有映射到这个文件的虚拟内存区域vm_area_struct实例的关系,从而可以得到所有映射到这个文件的进程信息。这张图表示了一个后备文件被mmap映射后内核建立的一些数据结构,涉及到了内存管理的数据和文件系统的数据

内核提供了一系列的函数对虚拟内存区域vm_area_struct进行操作,比如创建,删除,合并,查找等等。而mmap是C标准库提供给用户程序的一个函数来使用内存映射,建立起文件地址空间和虚拟内存区域的映射关系。

mmap的4种类型

mmap分为有后备文件的映射和匿名文件的映射,这两种映射又有私有映射和共享映射之分,所以mmap可以创建4种类型的映射

1. 后备文件的共享映射,多个进程的vm_area_struct指向同一个物理内存区域,一个进程对文件内容的修改,会被其他进程可见。对文件内容的修改会被写回到后备文件。

人生的大部份时间里,承诺同义词是束缚,奈何我们向往束缚。

计算机底层知识拾遗(九)深入理解内存映射mmap

相关文章:

你感兴趣的文章:

标签云: