Linux内核中是否有办法分配一块内存并指定它需要位于指定的虚拟地址?
我意识到这可能并不总是可能的,因为那块内存可能无法使用。但是如果那个大块好可用,我有办法要求它吗?
我问这个是因为我想首先分配一小块内存,如果需要的话,增加它的大小而不必分配另一个更大的内存块并复制一切。
编辑:
有人指出,在用户空间,realloc()完全符合我的需要。但是在内核空间中是否存在等价物?
答案 0 :(得分:1)
有关realloc()
使用的机制,请参阅man mremap()
。实现它的机制在内核中。见mremap.c。 mremap()
尝试为用户空间设置相邻内存,以便可以增加范围。它可能不适用于内核空间。
您可以请求虚拟地址空间区域,并在a specific address处申请。请参阅LWN的vmap()
。剩下的就是为这个虚拟地址分配一些物理页面。
kmalloc()
在页面级别工作,然后在页面内提供分箱(通过SLAB,SLUB等)。见kmalloc size allocation。在您的情况下,您不能共享页面,以便其他人可以使用它。如果你在该地区发展并且其他人使用它,那么你必须移动内存。
有关移动的信息,请参阅do_krealloc()
。如果您的总尺寸较小,则可以使用krealloc()
。如果它们很大(> 16k),那么您应该使用vmap()
或使用vfs_writev()
的备用接口而不是vfs_write()
。请注意,即使16k的大小也可能因系统内存碎片而失败。这就是为什么人们通常只使用一个页面,因为它永远不会碎片化。