Bra*_*rad 16
不,那里没有.你也需要从内核空间做到这一点.
如果你说"我们需要从用户空间执行此操作" - 内核空间中没有任何内容就没有意义 - 因为用户空间程序无法控制甚至不知道底层内存是否是连续的.
您需要执行此操作的唯一原因是 - 如果您与一个硬件或其他需要此要求的低级(即内核)服务一起工作.所以,你必须在那个级别处理它.
所以答案不仅仅是"你不能" - 而是"你永远不应该".
我曾经写过这样的内存管理器是不容许我这样做-但它是因为在内核级别,其中有在内核一级处理一些潜在的问题始终.通常,因为总线上的某些其他代理(PCI卡,BIOS或甚至是RDMA接口上的另一台计算机)具有物理连续内存要求.同样,所有这些都必须在内核空间中解决.
当你谈到"缓存行"时 - 你不必担心.您可以放心,每个页面的用户存储空间的是连续的,并且每一页比高速缓存行(无论你在说什么架构)大得多.
是的,如果您只需要几页,这确实是可能的.
该文件/proc/[pid]/pagemap现在允许程序检查其虚拟内存到物理内存的映射.
虽然您无法显式修改映射,但您可以只分配一个虚拟页面,通过调用将mlock其锁定到内存中,通过查找记录其物理地址/proc/self/pagemap,然后重复直到您碰巧得到足够的块来触摸彼此以创建一个大的足够的连续块.然后解锁并释放多余的块.
这是骇人的,笨重的,可能很慢,但值得一试.另一方面,这实际上并不是你真正需要的机会.