0

Linux内核中有没有办法分配一块内存并指定它需要位于指定的虚拟地址?

我意识到这可能并不总是可能的,因为那块内存可能不可用。但是,如果该块恰好可用,我有没有办法认领它?

我问这个是因为我想首先分配一小块内存,如果需要,增加它的大小,而不必分配另一个更大的内存块并复制所有内容。

编辑:

正如有人指出的那样,在用户空间, realloc() 完全符合我的需要。但是内核空间中是否存在等价物?

4

1 回答 1

1

有关使用的机制,请参见manmremap()realloc()。实现这一点的机制在内核中。请参阅mremap.cmremap()尝试为用户空间设置相邻的内存,以便可以扩大范围。它可能不适用于内核空间。

您可以请求一个虚拟地址空间区域,也可以在特定地址请求它。见vmap()LWN。剩下的就是将一些物理页面分配给这个虚拟地址。

kmalloc()在页面级别工作,然后在页面内提供分箱(通过 SLAB、SLUB 等)。请参阅kmalloc 大小分配‌</a>​。在您的情况下,您不能共享该页面,以便其他人可以使用它。如果您扩大该区域并且其他人使用它,那么您必须移动内存。

do_krealloc()搬家。如果您的总尺寸很小,那么您可以使用krealloc(). 如果它们很大(>16k),那么您应该使用vmap()或使用替代界面vfs_writev()而不是vfs_write(). 请注意,即使是 16k 的大小也可能会因为系统内存碎片化而失败。这就是为什么人们通常只使用一个页面,因为它永远不会碎片化。

于 2013-11-13T15:39:40.297 回答