Linux内核中有没有办法分配一块内存并指定它需要位于指定的虚拟地址?
我意识到这可能并不总是可能的,因为那块内存可能不可用。但是,如果该块恰好可用,我有没有办法认领它?
我问这个是因为我想首先分配一小块内存,如果需要,增加它的大小,而不必分配另一个更大的内存块并复制所有内容。
编辑:
正如有人指出的那样,在用户空间, realloc() 完全符合我的需要。但是内核空间中是否存在等价物?
Linux内核中有没有办法分配一块内存并指定它需要位于指定的虚拟地址?
我意识到这可能并不总是可能的,因为那块内存可能不可用。但是,如果该块恰好可用,我有没有办法认领它?
我问这个是因为我想首先分配一小块内存,如果需要,增加它的大小,而不必分配另一个更大的内存块并复制所有内容。
编辑:
正如有人指出的那样,在用户空间, realloc() 完全符合我的需要。但是内核空间中是否存在等价物?
有关使用的机制,请参见manmremap()
realloc()
。实现这一点的机制在内核中。请参阅mremap.c。 mremap()
尝试为用户空间设置相邻的内存,以便可以扩大范围。它可能不适用于内核空间。
您可以请求一个虚拟地址空间区域,也可以在特定地址请求它。见vmap()
LWN。剩下的就是将一些物理页面分配给这个虚拟地址。
kmalloc()
在页面级别工作,然后在页面内提供分箱(通过 SLAB、SLUB 等)。请参阅kmalloc 大小分配</a>。在您的情况下,您不能共享该页面,以便其他人可以使用它。如果您扩大该区域并且其他人使用它,那么您必须移动内存。
看do_krealloc()
搬家。如果您的总尺寸很小,那么您可以使用krealloc()
. 如果它们很大(>16k),那么您应该使用vmap()
或使用替代界面vfs_writev()
而不是vfs_write()
. 请注意,即使是 16k 的大小也可能会因为系统内存碎片化而失败。这就是为什么人们通常只使用一个页面,因为它永远不会碎片化。