我有 IPCORE,它需要物理地址来与 RAM 通信。 我知道当我在用户空间中执行 MALLOC 时,它会分配内存部分。 现在我需要知道的是这个分配的内存的地址。这样我就可以将它分配给IPCORE并让它对其执行操作。
我希望有某种方法可以在用户空间中做到这一点。 我不擅长内核空间的驱动程序。
谢谢
最佳答案
用户空间程序的工作方式就像是在计算机上运行的单个程序一样。程序自私地占据了所有的整个地址空间,而不区分虚拟内存和物理内存。虚拟内存完全由内核管理,对程序透明。如果您没有用于与内核交互的特殊 API,您将永远无法知道您是在虚拟化环境中还是在裸机上运行。
所以答案取决于您使用的操作系统。
在 Linux 中,您可以通过
proc
文件系统接口(interface)与内核交互。进程的所有映射都位于/proc/$PID/pagemap
。pagemap
的二进制格式如下所述: https://www.kernel.org/doc/Documentation/vm/pagemap.txt这是一篇文章,其中包含如何解析它的特定示例:http://fivelinesofcode.blogspot.ru/2014/03/how-to-translate-virtual-to-physical.html
对于 Windows,
根据这个SO答案: How to translate a virtual memory address to a physical address?
您必须编写自定义驱动程序。
其他操作系统 - 尝试在您的操作系统的文档中找到它
此外,如果没有特殊的机制,通常无法通过共享内存在内核和用户空间之间进行通信。这可能很危险,因为在应用程序运行时,VM 页面可能会移动到物理内存中的另一个位置,甚至可能会从物理内存移出到磁盘(交换或页面文件)。因此,也许您需要为您的任务寻找更合适的方法,或者至少锁定共享内存页。
关于将malloc的虚拟地址转换为用户空间的物理地址,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24821423/