内存映射:将一个虚拟内存区域与一个磁盘上的对象关联起来。

Linux中,虚拟内存区域可以映射到两种类型的对象:普通文件、匿名文件。

普通文件:一个虚拟内存区域可以映射到一个普通磁盘文件的连续部分。注意,因为页面调度是按需调度,故虚拟页面并没有实际交换入内存,直到CPU第一次确实引用一个页面。

匿名文件:匿名文件由内核创建,包含二进制0。CPU第一次引用这种虚拟页面时,内核在物理内存中找到合适的牺牲页,进行可能的写回后,用二进制0覆盖页面,更新页表,将这个页面标记为驻留在内存中的。磁盘和内存之间还是没有实际的数据传送。映射到匿名文件的页面又称为请求了二进制0的页。

一旦一个虚页被初始化了,他就在一个由内核维护的交换文件之间换来换去。任何时候,交换空间限制着当前运行的进程能分配的虚拟页面总数。

一个对象可以映射到虚拟内存中的一个区域,或是作为共享对象,或是作为私有对象。

对共享对象所作的改变,在不同进程间都是可见的,只要这些进程全部引用了同一个共享对象。

私有对象采用了写时复制技术。一句话描述特点:一个进程对私有写时复制对象进行写操作的时刻,故障处理程序将创建这个页面的一个新副本,更新该进程的页表条目、恢复页面的写权限。

fork函数:fork函数将两个进程的每个页面都标记为只读,将两个进程的每个区域结构标记为私有的写时复制。

execve函数:该函数在当前进程中加载并运行指定的可执行目标文件,用新程序替代当前程序。存在以下执行步骤:

  • 删除当前进程虚拟地址的用户部分已存在的区域结构。
  • 为新程序代码、数据、bss、栈区域创建新的区域结构。bss请求二进制0,大小包含在程序中,代码和数据区映射到新程序的.text、.data区。栈和堆请求二进制0,初始长度为0。
  • 动态链接库需要映射到用户虚拟地址空间的共享区域。
  • 设置程序计数器。

mmap函数:要求内核创建一个新的虚拟内存区域。将给定的文件描述符指定的对象的一个连续片映射到这个新区域。