Linux(Ubuntu),C语言:虚拟到物理地址转换

8 c linux virtual-memory

正如标题所示,我有一个从虚拟地址获取物理地址的问题.

让我解释一下:给定进程空间中的变量声明,如何从OS映射它的物理地址?

我已经在一些SYS电话绊倒/asm/io.hvirt_to_phys()函数定义; 但是看起来这个标题已经过时了,我无法找到解决方法.

然而; io.h可在以下位置获得:/usr/src/linux-headers-2.6.35-28-generic/arch/x86/include/asm/.我当前的内核是2.6.35-28,但io.h不包括在内/usr/include/asm/

所以,重申一下:我需要一种从虚拟中获取物理地址的方法.优选地,在运行时从应用程序内派生.但即使是使用监视器的解决方法/proc/PID/maps也可以.

任何想法或意见将不胜感激.


编辑 在对这个主题做了一些研究之后,我发现了一些在这方面有所帮助的东西.

事实证明这是可行的,虽然需要一些解决方法.这是一个分析当前映射页面的简单应用程序的链接.有问题的文件是(二进制文件)/proc/pid/pagemap(包含虚拟页面的物理映射).无论如何,该链接中的代码可以被修改为用作监视器应用程序或其他东西.

我需要物理地址进行缓存模拟.

感谢所有的帮助和答案!

Gil*_*il' 21

在用户代码中,您无法知道与虚拟地址对应的物理地址.这是信息根本不在内核之外导出.它甚至可以随时更改,尤其是在内核决定交换部分进程内存的情况下.

/proc/$pid/maps,您可以获得有关程序地址空间中的虚拟地址对应的信息(mmapped文件,堆,堆栈等).这就是你所能得到的.

如果您正在处理内核代码(显然不是这样),您可以找到与内存页面对应的物理地址.但即使这样virt_to_phys,也不是整个故事; 我建议你阅读Linux设备驱动程序(特别是章815).

标头asm/io.h是内核头.当您编译用户代码时它不可用,因为它的内容没有意义.它声明的函数在任何库中都不可用,只在内核中可用.

  • +1我想指出,如果内存被换出,则物理位置甚至不存在 (3认同)