物理页面的多个映射

时间:2015-02-27 01:58:56

标签: c linux mmap virtual-memory

我想在GNU C中创建一个类似于copy的写入接口来访问mmap() ed文件。以下是它的工作方式:

  1. 我将使用mmap()将文件映射到地址空间。这样做,我将指向一个包含真实数据的连续内存区域。
  2. 使用某种魔法,我将使地址空间的另一部分指向完全相同的物理页面。换句话说,我将有两个不同的地址来访问mmap() ed区域内存的任何物理页面。
  3. 一旦指令尝试使用第二个映射写入页面,我将更改该特定页面的映射以指向不同的物理页面(我将以按需方式创建)。
  4. 在某些时候,我会将脏页面与最初映射的页面同步,并将别名更改为指向内存映射页面。
  5. 这是一个问题:最好的方法是什么?

1 个答案:

答案 0 :(得分:2)

仍然不完全清楚您的确切要求。但是我看到了一些选项。

让mmap使用MAP_PRIVATE为您处理COW。然后,当您准备好同步时,只需创建一个常规mmap(或直接打开文件)到原始文件,然后与修改后的MAP_PRIVATE页面同步。

这并不能让您知道MAP_PRIVATE页面是否实际被修改过。如果你想要那样(例如,为了你可以优化而不进行同步,除非页面已经改变),那么你可以只读取MAP_PRIVATE页面。首次访问时,将发生SEGV。使用信号处理程序捕获SEGV并将MAP_PRIVATE页面重新映射为可写入,并在内部将其标记为脏。

最后,如果您不想使用MAP_PRIVATE并希望完全复制控制,请不要使用MMAP_PRIVATE,而是执行只读映射和信号处理程序。在信号处理程序中,分配一些内存,复制原始页面并重新映射错误页面。

希望一切都有意义。