15

可以从 linux 2.6.30+ 下的用户空间访问(非共享)mmap 页面的脏度吗?欢迎使用特定于平台的 hacks 和 kludges。

理想情况下,我正在寻找一个位数组,每页一个(4kB?)mmap'ed 区域,如果在该区域被 mmap'ed 后已写入该页面,则设置这些位。

(我知道,进行写入的过程可以跟踪这些信息 - 但如果内核仍然这样做,这样做似乎很愚蠢。)

谢谢,

克里斯。

4

5 回答 5

12

请参阅 /proc/*/pagemap/proc/kpageflags 接口。首先告诉你一个地址的 PFN,第二个告诉你给定 PFN 的脏位。

请参见 fs/proc/task_mmu.c、Documentation/vm/pagemap.txt、Documentation/vm/page-types.c。

于 2010-06-22T06:46:25.887 回答
5

传统的解决方案是将 mprotect 设为只读,然后处理 sigsegv 并标记脏,然后再重新保护以允许写入。很久以前,我们在 ObjectStore 就是为了这个目的而这样做的。

于 2010-06-18T20:02:06.723 回答
2

generic_writepagesbalance_dirty_pages_ratelimited_nr似乎是与脏页相关的内核 (2.6.20) 的入口点。我希望它们也能在 2.6.30+ 中工作。有趣的问题,我能问一下你在写什么需要对页面进行这样的控制吗?

于 2010-06-17T10:18:08.780 回答
1

此数据将不断过期 - 在您的进程看到页面脏后,该页面可能会被写回。

也就是说,音调方法是将其映射为一页块,然后查看/proc/pid/smaps块是否脏 - 也就是说,如果内核合并页面,这可能会失败。

不幸的是,由于页表对用户空间进程是不可见的,所以在没有某种内核补丁的情况下,这是最好的。

于 2010-06-21T17:40:45.367 回答
0

如果您的位数组足够小,也许您可​​以使用 Intel 上的调试寄存器(尽管我不确定它是如何在 linux 上完成的)。

于 2010-06-19T16:15:40.070 回答