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

xff*_*fox 18 linux memory

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

Bra*_*rad 16

不,那里没有.你需要从内核空间做到这一点.

如果你说"我们需要从用户空间执行此操作" - 内核空间中没有任何内容就没有意义 - 因为用户空间程序无法控制甚至不知道底层内存是否是连续的.

您需要执行此操作的唯一原因是 - 如果您与一个硬件或其他需要此要求的低级(即内核)服务一起工作.所以,你必须在那个级别处理它.

所以答案不仅仅是"你不能" - 而是"你永远不应该".

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

当你谈到"缓存行"时 - 你不必担心.您可以放心,每个页面的用户存储空间的是连续的,并且每一比高速缓存行(无论你在说什么架构)大得多.

  • 人们提出问题是因为他们手头有问题需要解决。例如 Knights Landing 在 MCDRAM 中带有直接映射缓存。如果您可以将常用数据粘贴到相同的 16GB 物理范围内,则可以确保不会出现导致缓存抖动的缓存冲突。 (3认同)

Pon*_*dle 9

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

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

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

这是骇人的,笨重的,可能很慢,但值得一试.另一方面,这实际上并不是你真正需要的机会.