• Linux 通过将虚拟内存区域与磁盘上的对象关联起来以初始化这个虚拟内存区域的内容.
    • 这个过程称为内存映射(memory mapping)
  • 虚拟内存区域可以映射的对象 (根据初始值的不同来源分) :
    • 磁盘上的普通文件 (e.g.,一个可执行目标文件)
      • 文件区被分成页大小的片,对虚拟页面初始化
    • 匿名文件 ( 内核创建,全是二进制零)(bss 未初始化全局变量)
      • 第一次引用该区域内的虚拟页面时分配一个全是零的物理页 (demand-zero page请求二进制零的页)
      • 一旦该页面被修改,即和其他页面一样
  • 初始化后的页面在内存和交换文件( swap file)之间换来换去

    假设这样一个情景:
    物理内存中,保存了一个共有的 x=1,进程 1 读取这一段的时候,将 x 改为了 2,但是进程 2 也共享了这段,读取出来也就变成了 2,我们不希望这样的情况发生,于是,这段物理内存被定义为私有的写时复制对象
    私有的写时复制对象,这两个进程,共享读取,但是他们要对其中的变量进行修改时,会各自复制一份自己的拷贝,进行修改
  • 写私有页的指令触发保护故障
  • 故障处理程序创建这个页面的一个新副本,更新PTE条目,且可写
  • 故障处理程序返回时重新执行写指令
  • 尽可能地延迟拷贝(创建副本)充分利用物理内存