【问题标题】:Difference between kmalloc and kmem_cache_allockmalloc 和 kmem_cache_alloc 的区别
【发布时间】:2014-03-13 05:49:34
【问题描述】:

kmem_cache_allockmalloc() 在内核内存分配上有什么区别?什么时候用?

【问题讨论】:

标签: linux-kernel


【解决方案1】:

Kmalloc - 从物理内存分配连续区域。但请记住,分配和释放内存需要大量工作。

Kmem_cache_alloc - 在这里,您的进程保留一些预分配的预定义大小对象的副本。假设您有一个结构,您知道您将非常频繁地需要它,因此您不需要在需要时从主内存 (kmalloc) 分配它,而是已经分配了它的多个副本,当您需要它时,它会返回已分配的块(节省大量时间)。同样,当你释放它时,你不会把它还给它,它实际上并没有被释放,它会回到分配的池中,这样如果某个进程再次请求它,你可以返回已经分配的这个地址结构。

【讨论】:

  • 对象大小是多少?来电者在哪里
  • kmem_cache_alloc 是否保证在页面边界分配,例如出于 DMA 的目的?
  • @马克。有SLAB_CACHE_DMA标志在DMA区域分配内存。
  • kmalloc 分配和释放内存不可能是真的。它使用可用于任何内核代码的通用平板缓存。
  • 我相信释放kmalloced 内存也会返回到池中,而不是完全释放,不是吗?
【解决方案2】:

kmalloc:它使用可用于任何内核代码的通用平板缓存。所以你的模块将与内核中的其他组件共享slab缓存。

kmem_cache_alloc:它将从由kmem_cache_create 创建的专用slab 缓存中分配对象。如果您特别想要一个更好的平板缓存管理专用于您的模块,也适用于特定类型的对象,请使用 kmem_cache_create 后跟 kmem_cache_alloc。 USB/SCSI 驱动程序使用它。 kmem_cache_create 获取您要创建slab 的对象的大小、出现在/proc/slabinfo 中的名称和用于管理slab 缓存行为的标志。

参考:https://www.mail-archive.com/kernelnewbies@nl.linux.org/msg13191.html & LDD

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-05-20
    • 1970-01-01
    • 2017-02-17
    • 2014-03-26
    • 1970-01-01
    • 2013-02-27
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多