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

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

不。 不能保证虚拟地址是以物理地址为基础的(例如,它可能是一个在RAM中没有表示的映射文件)。而且,操作系统可以随时在物理内存中随意移动虚拟地址,所以不能保证物理地址将保持正确或有效。

你为什么认为你需要一个物理地址? 你想达到什么目的?

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

或者看看/ proc / pid / maps

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

没有在内核中运行你的代码,没有好的方法可以做到这一点,尽管如果你的程序运行在root并且你能够读取/proc/kcore (也许是/proc/kallsyms )和通过大量的工作能够找到你的过程的页面信息,并在那里查找地址。

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

此外,当你正在阅读他们正在改变的页面表。 你不能像在内核空间那样将它们从应用程序空间中锁定,所以我不确定你能否抓住这个结构的好机会。

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

我遇到类似的问题,昨天发布。 大多数情况下,每个答案似乎都是说“不能”这样做,但根据下面的链接,这是非常可行的。 原来,你可以用两种方法做到这一点:创建一个独立的守护进程工具,并监视/ proc / $ pid / maps和/ proc $ pid / pagemaps(这是一个包含物理页面地址的二进制文件)可以看看他们的节目,并希望调整为自己的目的。 或者你可以简单地停止你的程序,并调用这个工具来读取/ proc中的当前信息。 希望这可以帮助。

编辑我必须调整工具为我自己的目的,这个标题信息应该帮助你。