我有IPCORE需要物理地址与RAM通信。 我知道当我在用户空间中执行MALLOC时,它会分配内存部分。 现在我需要知道的是这个分配的内存的地址。这样我就可以将它分配给IPCORE并让它对它进行操作。
我希望在用户空间中有一些方法可以做到这一点。 我对内核空间的驱动程序不太满意。
由于
答案 0 :(得分:0)
用户空间程序就像在计算机上运行的单个程序一样工作。该程序自我占据所有整个地址空间,而不区分虚拟和物理内存。虚拟内存完全由内核管理,对程序透明。如果您没有用于与内核交互的特殊API,则无法知道您是在虚拟化环境中运行还是在裸机上运行。
所以答案取决于你正在使用的操作系统。
在Linux中,您可以通过proc
文件系统界面与内核进行交互。进程的所有映射都位于/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页面可能在应用程序运行时被移动到物理内存中的另一个位置,或者甚至可能被移出物理内存到磁盘(交换或页面文件)。因此,您可能需要为您的任务搜索更合适的方式,或者至少锁定共享的内存页面。