【问题标题】:Find physical memory address from virtual memory address从虚拟内存地址中查找物理内存地址
【发布时间】:2014-09-06 05:43:43
【问题描述】:
  • 在 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 中以编程方式简单地完成?

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

【问题讨论】:

  • 如果没有办法,那么您当然可以编写一个内核模块来提供一个接口来查找,但我很好奇您为什么要查找?据推测,仅仅因为它在您检查时被共享并不意味着它稍后会被共享。
  • 从应用程序的角度来看,不存在物理地址之类的东西。所有地址都是虚拟的,您不知道它们所指的物理地址(如果有的话!很可能不存在物理地址!)。即使您能够确定某个位置所指的物理地址,下一刻也可能不再正确。

标签: c linux unix memory-management


【解决方案1】:

在 Linux 上,您可以通过解析 /proc/&lt;pid&gt; 中的文件来做到这一点,即 mapspagemap。有一个小的用户空间工具可以为你做这件事here

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

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

【讨论】:

    猜你喜欢
    • 2014-05-18
    • 1970-01-01
    • 2010-09-26
    • 2018-07-09
    • 2011-06-13
    • 1970-01-01
    • 2018-10-09
    • 1970-01-01
    • 2015-05-04
    相关资源
    最近更新 更多