我想解决的真正问题是,如何判断操作系统是否将两个虚拟地址映射到完全相同的物理区域?
E.g。在下面的smaps
示例中,我如何知道两个内存区域实际上是否在物理上相同?
cat /proc/<pid>/smaps
...
7f7165d42000-7f7265d42000 r--p 00000000 00:14 641846 /run/shm/test (deleted)
Size: 4194304 kB
Rss: 4194304 kB
Pss: 2097152 kB
...
VmFlags: rd mr mw me nr sd
7f7265d42000-7f7365d42000 rw-s 00000000 00:14 641846 /run/shm/test
Size: 4194304 kB
Rss: 4194304 kB
Pss: 2097152 kB
...
VmFlags: rd wr sh mr mw me ms sd
...
奖励:有没有办法在 C 中以编程方式执行?
我试图寻找副本,但找不到相关的。
答案 0 :(得分:3)
在Linux上,您可以通过解析/proc/<pid>
中的文件,即maps
和pagemap
来完成此操作。有一个小的用户空间工具可以为您here执行此操作。
编译它(不需要特殊选项),运行page-types -p <pid> -l -N
,在第一列中找到虚拟页面地址,在第二列中读取物理地址。
将其转换为库并以编程方式使用应该很简单。请记住,该实用程序的某些操作需要root访问权限(例如,阅读/proc/kpageflags
),但是,此任务不需要任何操作。