来自用户空间的连续物理内存
- 2024-10-24 08:50:00
- admin 原创
- 83
问题描述:
有没有办法在 Linux 中从用户空间分配连续的物理内存?至少有几个保证连续的内存页面。一个巨大的页面不是答案。
解决方案 1:
没有。您需要从内核空间执行此操作。
如果您说“我们需要从用户空间执行此操作” - 而内核空间中没有发生任何事情,这没有什么意义 - 因为用户空间程序无法控制甚至不知道底层内存是否连续。
您需要这样做的唯一原因是,如果您要与硬件或需要此要求的其他低级(即内核)服务协同工作。因此,您必须在该级别处理它。
因此,答案不仅仅是“你不能”——而且“你永远不需要”。
我编写过这样的内存管理器,它们确实允许我这样做 - 但这总是因为内核级别的一些潜在问题,而这些问题必须在内核级别解决。通常是因为总线上的某些其他代理(PCI 卡、BIOS 甚至 RDMA 接口上的另一台计算机)有物理连续内存要求。同样,所有这些都必须在内核空间中解决。
当您谈论“缓存行”时,您无需担心。您可以放心,用户空间内存的每个页面都是连续的,并且每个页面都比缓存行大得多(无论您谈论的是哪种架构)。
解决方案 2:
是的,如果您只需要几页,这确实是可能的。
该文件/proc/[pid]/pagemap
现在允许程序检查其虚拟内存到物理内存的映射。
虽然您无法明确修改映射,但您可以分配一个虚拟页面,通过调用 将其锁定到内存中mlock
,通过查找 记录其物理地址/proc/self/pagemap
,然后重复此过程,直到您恰好获得足够多的相互接触的块以创建足够大的连续块。然后解锁并释放多余的块。
它有点儿老套、笨重,而且速度可能比较慢,但值得一试。另一方面,这很可能不是你真正需要的。
解决方案 3:
DPDK 库的内存分配器使用@Wallacoloo描述的方法。eal_memory.c 。代码采用 BSD 许可。
解决方案 4:
如果特定设备驱动程序导出物理连续的 dma 缓冲区,则用户空间可以通过 dma buf api 访问,因此用户任务可以访问但不能直接分配
这是因为物理上连续的约束不是来自用户应用程序而仅来自设备,因此只有设备驱动程序才应该关心。
- 2024年20款好用的项目管理软件推荐,项目管理提效的20个工具和技巧
- 2024年开源项目管理软件有哪些?推荐5款好用的项目管理工具
- 项目管理软件有哪些?推荐7款超好用的项目管理工具
- 项目管理软件哪个最好用?盘点推荐5款好用的项目管理工具
- 项目管理软件有哪些最好用?推荐6款好用的项目管理工具
- 2024年常用的项目管理软件有哪些?推荐这10款国内外好用的项目管理工具
- 项目管理软件有哪些,盘点推荐国内外超好用的7款项目管理工具
- 2024项目管理软件排行榜(10类常用的项目管理工具全推荐)
- 项目管理软件排行榜:2024年项目经理必备5款开源项目管理软件汇总
- 项目管理必备:盘点2024年13款好用的项目管理软件