c - 从虚拟内存地址查找物理内存地址

标签 c linux unix memory-management

  • 在 Unix 系统上,我可以找到给定虚拟内存地址的物理内存地址吗?如果是,怎么做?

我要解决的真正问题是,我如何确定操作系统是否将两个虚拟地址映射到完全相同的物理区域?

例如在下面的 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 中以编程方式简单地完成它?

我试图寻找重复项,但找不到相关的。

最佳答案

在 Linux 上,您可以通过解析 /proc/<pid> 中的文件来完成此操作,即 mapspagemap .有一个小的用户空间工具可以为你做这件事here .

编译它(不需要特殊选项),运行page-types -p <pid> -l -N ,在第一列找到虚拟页地址,在第二列读取物理地址。

将其转换为库并以编程方式使用应该很简单。请记住,该实用程序的某些操作需要根访问权限(例如读取 /proc/kpageflags ),但是,此任务不需要任何权限。

关于c - 从虚拟内存地址查找物理内存地址,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24768199/

相关文章:

c - Unix系统编程: get a network identifier to be passed to getaddrinfo

c++ - gdb如何附加到多线程进程

c - C 矩阵代码的方向正确吗?

c - 跳过 OpenGL 预编译 header

linux - 任何人给我一个 SORT 的解决方案

linux - ping命令中的-U选项有什么用?

c - 传递和更改数组,通过引用传递,使用 C 中的指针

linux - 为什么我的项目运行良好但在模拟器中不显示?

linux - 使用 chroot 运行命令时我的权限被拒绝