【问题标题】:allocate a memory chunk at a specified address in Linux kernel在 Linux 内核中的指定地址分配内存块
【发布时间】:2013-11-13 04:32:05
【问题描述】:

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

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

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

编辑:

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

【问题讨论】:

  • 你为什么要这样做?
  • 为什么不保留一块比您需要的更大的地址空间?

标签: linux memory memory-management linux-kernel


【解决方案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 的大小也可能会因为系统内存碎片化而失败。这就是为什么人们通常只使用一个页面,因为它永远不会碎片化。

【讨论】:

  • 因为稍后我需要将这块内存传递给 vfs_write,这需要几乎连续的内存。我想我也可以申请非连续的内存块,并使用vfs_writev(),但这种方式似乎更容易
  • 另外,似乎 vmap 在页面级别工作,有什么东西可以在字节级别工作吗?谢谢!
  • realloc() 在字节级别工作。我在想如果有什么东西可以跟踪在页面映射之上分配的内存,比如 libc 为 malloc() 维护的循环列表,那么就有可能实现它。由于内核有 kmalloc(),我希望它有类似的机制。
  • 听起来你想要vmrealloc(),但我不相信这存在。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-10-02
  • 1970-01-01
  • 2018-01-29
  • 2013-11-14
  • 2021-10-29
  • 1970-01-01
相关资源
最近更新 更多