在Linux内核中的指定地址分配内存块

时间:2013-11-13 04:32:06

标签: linux memory memory-management linux-kernel

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

我意识到这可能并不总是可能的,因为那块内存可能无法使用。但是如果那个大块好可用,我有办法要求它吗?

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

编辑:

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

1 个答案:

答案 0 :(得分:1)

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

您可以请求虚拟地址空间区域,并在a specific address处申请。请参阅LWN的vmap()。剩下的就是为这个虚拟地址分配一些物理页面。

kmalloc()在页面级别工作,然后在页面内提供分箱(通过SLAB,SLUB等)。见kmalloc size allocation‌。在您的情况下,您不能共享页面,以便其他人可以使用它。如果你在该地区发展并且其他人使用它,那么你必须移动内存。

有关移动的信息,请参阅do_krealloc()。如果您的总尺寸较小,则可以使用krealloc()。如果它们很大(> 16k),那么您应该使用vmap()或使用vfs_writev()的备用接口而不是vfs_write()。请注意,即使16k的大小也可能因系统内存碎片而失败。这就是为什么人们通常只使用一个页面,因为它永远不会碎片化。