我在C中编写了一个程序来显示虚拟地址和物理地址之间的对应关系。目的是检查写入时复制是否真的在Linux内核中实现。场景很简单。一个进程声明一个变量,比如int a;然后调用fork(); fork之后,两个进程都显示变量a的(虚拟)地址。例如,通过使用pause(),两个进程都保持活动状态。在一个单独的程序中,我打开文件/ proc // pagemap,在内部查找由vpn索引的8字节实体(虚拟页码),并提取物理帧号,然后提取变量a的物理地址。好吧,它在父级和子级中是不同的,即使没有进程在变量a中写入。这意味着即使未写入变量,页面也会在物理内存中重复。当在数据区域中声明a时,以及在堆栈中(在main函数内部),我进行了测试。在这两种情况下,即使没有对变量进行任何写入,物理地址也是不同的。唯一的情况是,在父和子中,无写入变量的物理地址是相同的,就是在堆中声明它时(int * a =(int *)malloc(sizeof(int))。即使在此后一种情况,当我使用其他机器时,物理地址是不同的。所以我的结论是copy-(only)-on-write没有真正实现。我缺少什么?我的内核是现代的:Linux 3.16.1-1- ARCH x86_64。