有没有办法从linux中的用户空间分配连续的物理内存?至少几个保证连续的内存页面。一个巨大的页面不是答案。
答案 0 :(得分:14)
没有。那没有。 做需要从内核空间执行此操作。
如果您说“我们需要从用户空间执行此操作” - 内核空间中没有任何内容,那就毫无意义了 - 因为用户空间程序无法控制甚至不知道如果底层内存是连续的。
您需要执行此操作的唯一原因是 - 如果您与一个硬件或其他需要此要求的低级(即内核)服务一起工作。所以,你必须在那个级别处理它。
所以答案不仅仅是“你不能” - 而是“你永远不需要”。
我已经写过这样的内存管理器,做允许我这样做 - 但它总是因为内核级别的一些底层问题,必须在内核级别解决。通常,因为总线上的某些其他代理(PCI卡,BIOS或甚至是RDMA接口上的另一台计算机)具有物理连续内存要求。同样,所有这些都必须在内核空间中解决。
当你谈到“缓存行”时 - 你不必担心。您可以放心,用户空间内存的每个页面都是连续的,每个页面比缓存行大得多(无论您正在谈论什么架构)约)。
答案 1 :(得分:7)
是的,如果你需要的只是几页,这确实是可能的。
文件/proc/[pid]/pagemap
现在允许程序检查其虚拟内存到物理内存的映射。
虽然您无法显式修改映射,但可以只分配一个虚拟页面,通过调用mlock
将其锁定到内存中,通过查找{{}来记录其物理地址1}},并重复直到你发生以获得足够的块接触彼此以创建足够大的连续块。然后解锁并释放多余的块。
这是骇人的,笨重的,可能很慢,但值得一试。另一方面,这实际上并不是你真正需要的机会。
答案 2 :(得分:1)
DPDK库的内存分配器使用@Wallacoloo方法描述。 eal_memory.c。该代码是BSD许可的。
答案 3 :(得分:0)
如果特定设备驱动程序导出物理连续的dma缓冲区,则用户空间可以通过dma buf apis访问 所以用户任务可以访问但不能直接分配
这是因为物理上连续的约束不是来自用户应用,而只来自设备 所以只有设备驱动程序应该关心。