mmap文件-确定哪一页脏了

Pra*_*nth 2 linux mmap x86-64

我有一个固定大小的文件。已将文件ftruncate()设置为大小= N * getpagesize()。该文件具有固定大小的记录。我有一个编写器进程,它通过mmap(... MAP_SHARED ...)映射整个文件,并随机修改记录(像访问数组一样)。我有一个读者进程,它也执行mmap(... MAP_SHARED ...)。现在,读取器进程需要确定由于写入器进程向随机记录写入而导致哪个页面的映射发生了更改。有没有办法在用户空间中做到这一点?我在Linux-x86_64上。欢迎使用特定于平台的代码/ hack。感谢您的时间。

编辑:我无权修改编写者进程的代码,以某种方式向我指示已修改的记录。

Dam*_*mon 5

相关文件:

  1. http://lwn.net/Articles/230975/
  2. https://www.kernel.org/doc/Documentation/vm/pagemap.txt

    • 确定您的虚拟页面的编号(即除以4096),乘以8,然后在其中寻找该位置 /proc/*/pagemap
    • 读取8个字节,这是页面帧号(PFN)
    • 打开/proc/kpageflags,并寻求PFN,读取8个字节
    • 如果DIRTY设置了该标志,则该页面是脏的(换言之,编写者已对其进行写操作)
    • 对映射文件中的每个页面重复此操作