在使用C ++和GCC的Linux中,是否可以将虚拟地址转换为物理地址?

时间:2010-10-04 22:37:15

标签: c++ c linux gcc g++

在Linux,C ++和GCC下,我可以获得给定虚拟地址的物理地址吗?我知道我无法将物理地址作为物理地址进行操作。

4 个答案:

答案 0 :(得分:6)

不。无法保证虚拟地址基于物理地址(例如,它可能是RAM中没有表示的映射文件。)同样,操作系统可以随时在物理内存中移动虚拟地址,因此无法保证物理地址保持正确或有效。

为什么你认为你需要一个实际地址?你想要完成什么?

答案 1 :(得分:3)

我相信你可以编写一个linux内核模块来告诉你地址空间是如何映射的。那会很有趣

或者查看/ proc / pid / maps

我在看http://www.amazon.com/Linux-Kernel-Development-Robert-Love/dp/0672325128

答案 2 :(得分:1)

如果没有在内核中运行代码,没有好的方法可以执行此操作,但如果您的程序在root运行并且您能够阅读/proc/kcore(并且可能{{/proc/kallsyms,则可以执行此操作。 1}})并通过大量工作能够找到您的流程的页面表信息,并在那里查找地址。

问题在于,当你这样做的时候,你的程序不会留下来。即使包含地址的页面从未被分页,也可以移动(在x86上,某些页面不能用于DMA,因此可以移动页面以设置IO操作,我确信还有其他原因可以移动页面而不会被换出。)

此外,在您阅读页面表时,它们正在发生变化。你无法像在内核空间中那样将它们从应用程序空间锁定,因此我不确定你是否可以对这种结构进行良好的拍摄。

如果您真的希望在程序执行时看到页面地址发生变化,那么最好的方法是实现一个内核模块,让您查询它们,或者只是在每次调用特殊设备文件时读取整个页面映射。我认为这不会太困难,因为当前进程的进程控制块可用于调用驱动程序的读取功能。如果你想要能够检查其他进程的映射,那将会变得更加棘手。

答案 3 :(得分:1)

我遇到了类似的问题,昨天发布了。大多数答案似乎都说你“不能”这样做,但根据下面的链接,这是非常可行的。事实证明,您可以通过两种方式执行此操作:创建独立守护程序工具和监视/ proc / $ pid / maps和/ proc $ pid / pagemaps(这是一个包含物理页面地址的二进制文件) 在link之后,您可以查看他们的程序,并希望根据您自己的目的进行调整。或者你可以简单地停止你的程序并调用这个工具来读取/ proc中的当前信息。希望这会有所帮助。

修改的 我必须根据自己的目的调整工具,这个header信息可以帮助你。