在Linux,C ++和GCC下,我可以获得给定虚拟地址的物理地址吗?我知道我无法将物理地址作为物理地址进行操作。
答案 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)