繁体   English   中英

来自用户空间的连续物理内存

[英]Contiguous physical memory from userspace

有没有办法在linux中从用户空间分配连续的物理内存? 至少有几个保证连续的内存页面。 一个巨大的页面不是答案。

不,那里没有。 确实需要从内核空间执行此操作。

如果你说“我们需要从用户空间做这件事”——在内核空间没有任何事情发生,那就没什么意义了——因为用户空间程序无法控制甚至不知道底层内存是否是连续的。

您需要这样做的唯一原因 - 是如果您正在与需要此要求的硬件或其他一些低级(即内核)服务结合工作。 再说一次,你必须在那个级别处理它。

所以答案不仅仅是“你不能”——而是“你永远不需要”。

我已经编写了这样的内存管理器,确实允许我这样做 - 但它总是因为内核级别的一些潜在问题,必须在内核级别解决。 通常是因为总线上的其他一些代理(PCI 卡、BIOS 甚至另一台通过 RDMA 接口的计算机)具有物理连续内存要求。 同样,所有这些都必须在内核空间中解决。

当您谈论“缓存行”时 - 您无需担心。 您可以放心,您的用户存储空间的每一是连续的,并且每一比高速缓存行(无论你在说什么架构)大得多。

是的,如果您只需要几页,这确实是可能的。

文件/proc/[pid]/pagemap现在允许程序检查其虚拟内存到物理内存的映射。

虽然您无法显式修改映射,但您可以只分配一个虚拟页面,通过调用mlock将其锁定到内存中,通过查找/proc/self/pagemap记录其物理地址,然后重复直到恰好获得足够的块相互接触以创建足够大的连续块。 然后解锁并释放多余的块。

它是骇人听闻的,笨重的并且可能很慢,但值得一试。 另一方面,这很可能不是您真正需要的。

DPDK 库的内存分配器使用@Wallacoloo 描述的方法。 eal_memory.c 该代码是 BSD 许可的。

如果特定设备驱动程序导出物理连续的 dma 缓冲区,则用户空间可以通过 dma buf apis 访问,因此用户任务可以访问但不能直接分配

这是因为物理上连续的约束不是来自用户应用程序,而是来自设备,所以只有设备驱动程序应该关心。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM