【问题标题】:What is different functions: `malloc()` and `kmalloc()`?什么是不同的函数:`malloc()` 和 `kmalloc()`?
【发布时间】:2013-11-19 18:57:54
【问题描述】:

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

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

还是别的什么?

kmalloc() 在虚拟或物理寻址中使用指针,kmalloc()__ get_free_pages() 有何不同?

【问题讨论】:

  • 我很确定您可以在内核代码中调用的malloc() 不是您在用户代码中调用的malloc(),它位于 C 标准库中,未链接到内核.显然,他们有相同的名字,但仅此而已......
  • 您使用的是什么操作系统?我很想知道你在哪里读到关于内核空间中 malloc 的信息,假设你使用的是 linux 因为我从来没有读过内核空间中的 malloc 实现,我可以根据驱动程序的要求使用 kmalloc/vmalloc... . 此外,用户空间 (glibc) 中的 malloc 甚至不是原语,因为调用 dlmalloc() 调用 mmap() 或 brk().. 在您的帖子之后,我尝试在整个内核中进行 grep,我只能在“用户级实用程序”和“用户级驱动程序”

标签: c memory memory-management posix


【解决方案1】:

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

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

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 一样获取单个页面,但会将内存归零

【讨论】:

  • 谢谢!即get_free_page() 获取始终与PAGE_SIZE 对齐的指针,kmalloc() 中的相反获取指针未对齐并且可能与其他指针在同一页上,不是吗?
【解决方案2】:
  • malloc 使用Buddy algorithm 分配块。
  • kmalloc 内核服务在内核地址空间中分配物理上连续的内存区域,构建在使用 slab allocator 算法的平板和对象缓存接口之上。

More details here

【讨论】:

    猜你喜欢
    • 2017-08-08
    • 2011-05-20
    • 1970-01-01
    • 2011-04-25
    • 2017-01-19
    • 1970-01-01
    • 2013-09-13
    • 1970-01-01
    相关资源
    最近更新 更多