什么是不同的函数:`malloc()`和`kmalloc()`?

时间:2013-11-19 18:57:55

标签: c memory memory-management posix

有哪些不同的功能:malloc()kmalloc()? 它们的区别仅在于:

  • malloc()可以在用户空间和内核空间中调用,并且它会分配一个物理碎片化的内存区域
  • kmalloc()只能在内核空间中调用,并且它会分配物理上连续的内存块

或其他什么?

kmalloc()在虚拟或物理寻址中使用指针以及kmalloc()__ get_free_pages()的不同之处?

2 个答案:

答案 0 :(得分:3)

我回答第二个问题,假设您使用的是Linux操作系统。关于第一个,请看看我的评论。

kmalloc使用get_free_page来获取内存。收集页面的方式取决于第二个参数(GFP_ATOMIC GFP_KERNEL ...,其中GFP表示GET FREE PAGE)。 kmalloc在GFP上的优势在于它可以将多个分配整合到一个页面中。

kmalloc的一些选项是:

GFP_USER - Allocate memory on behalf of user. May sleep.
GFP_KERNEL - Allocate normal kernel ram. May sleep.
GFP_ATOMIC - Allocation will not sleep. May use emergency pools. For example, use this inside interrupt handlers.
GFP_HIGHUSER - Allocate pages from high memory.
GFP_NOIO - Do not do any I/O at all while trying to get memory.
GFP_NOFS - Do not make any fs calls while trying to get memory.
GFP_NOWAIT - Allocation will not sleep.
GFP_THISNODE - Allocate node-local memory only.
GFP_DMA - Allocation suitable for DMA. Should only be used for kmalloc caches. Otherwise, use a slab created with SLAB_DMA.

除此之外,get_free_pagekmalloc非常相似。 _get_free_pagesget_free_page不同,因为它指向内存区域的第一个字节,该内存区域可能是 几个(物理上连续的)页面 长。 另一个与get_free_page非常相似的函数是get_zeroed_page(unsigned int flags),它会获得像get_free_page这样的单个页面,但会将内存归零

答案 1 :(得分:0)

  • malloc 使用 Buddy algorithm 分配块。
  • kmalloc 内核服务在内核地址空间中分配物理上连续的内存区域,构建在使用 slab allocator 算法的平板和对象缓存接口之上。

More details here