将malloc的虚拟地址转换为用户空间中的物理地址

将malloc的虚拟地址转换为用户空间中的物理地址,c,C,我有一个IPCORE,它需要物理地址来与RAM通信。 我知道,当我在用户空间中执行MALLOC时,它会分配部分内存。 现在我只需要知道这个分配内存的地址。这样我就可以把它分配给IPCORE,让它对它执行操作 我希望在用户空间中有一些方法可以做到这一点。 我不擅长内核空间的驱动程序 谢谢一个用户空间程序的工作原理就像是一个在机器上运行的单一程序。程序自私地占据了整个地址空间,而不区分虚拟内存和物理内存。虚拟内存完全由内核管理,对程序透明。如果没有与内核交互的特殊API,则永远无法知道是在虚拟化环境

我有一个IPCORE,它需要物理地址来与RAM通信。 我知道,当我在用户空间中执行MALLOC时,它会分配部分内存。 现在我只需要知道这个分配内存的地址。这样我就可以把它分配给IPCORE,让它对它执行操作

我希望在用户空间中有一些方法可以做到这一点。 我不擅长内核空间的驱动程序


谢谢

一个用户空间程序的工作原理就像是一个在机器上运行的单一程序。程序自私地占据了整个地址空间,而不区分虚拟内存和物理内存。虚拟内存完全由内核管理,对程序透明。如果没有与内核交互的特殊API,则永远无法知道是在虚拟化环境中运行还是在裸机上运行

因此,答案取决于您使用的操作系统

  • 在Linux中,您可以通过
    proc
    文件系统接口与内核交互。进程的所有映射都位于
    /proc/$PID/pagemap

    此处描述了
    pagemap
    的二进制格式:

    下面是一篇文章,其中有一个具体的例子,说明如何解析它:

  • 至于窗户

    根据这一答案:

    您必须编写一个自定义驱动程序

  • 其他操作系统-尝试在操作系统的文档中找到它

此外,如果没有特殊的机制,通常无法通过共享内存在内核和用户空间之间进行通信。这可能是危险的,因为在应用程序运行时,VM页面可能会移动到物理内存中的另一个位置,甚至可能会从物理内存移到磁盘(交换或页面文件)。所以,也许你需要为你的任务寻找一种更合适的方式,或者至少锁定共享的内存页