可以从用户空间找到mmap页面的肮脏吗?

时间:2010-06-17 09:52:48

标签: c++ c linux linux-kernel mmap

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

理想情况下,我正在寻找一个位数组,每页一个(4kB?)mmap的区域,如果该区域已被写入,则设置该区域,因为该区域是mmap的。

(我知道,写作过程可以跟踪这些信息 - 但如果内核正在这样做,那么这样做似乎很愚蠢。)

谢谢,

克里斯。

5 个答案:

答案 0 :(得分:12)

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

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

答案 1 :(得分:5)

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

答案 2 :(得分:2)

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

答案 3 :(得分:1)

这些数据会不断过时 - 在您的流程看到页面变脏之后,页面可能会被写回。

那就是说,音调方式是将它映射到一页的块中,然后查看/proc/pid/smaps以查看块是否脏 - 也就是说,如果内核合并页面,这可能会失败。

不幸的是,由于页面表对于用户空间进程是不可见的,所以如果没有某种内核补丁,那就是最好的。

答案 4 :(得分:0)

如果您的位数足够小,也许您可​​以使用英特尔上的调试寄存器(虽然我不确定它是如何在Linux上完成的。)