查找不再与写时复制共享的页面

时间:2012-04-23 16:11:07

标签: c linux x86-64 copy-on-write page-tables

假设我在Linux中有一个进程,我fork()另一个相同的进程。在fork之后,当原始进程将开始写入内存时,Linux copy-on-write 机制将为进程提供唯一的物理内存页面,这些页面不同于分叉过程。

在某些执行点,我如何知道原始进程的哪些页面已被写入?

我不想使用SIGSEGV信号处理程序,并且只允许对开头的所有页面进行只读访问,因为这会导致我不想要的开销。

1 个答案:

答案 0 :(得分:0)

你可能不得不接受一些开销。

如果您有特权,可以pread / proc / self / pagemap(64位,偏移8 *(addr / PAGE_SIZE))来获得PFN(它是低54位)。然后在/ proc / kpagecount中查找PFN以查看页面是否已共享。

如果您没有权限,可以比较父母和子女的页面地图中的PFN。

通过比较Pss(比例集大小)与/ proc / smaps中的总大小,可以判断映射中的任何页面是否共享。