`malloc()`和`kmalloc()`有什么不同功能?

14
什么是不同的函数:malloc()kmalloc()?
它们之间的区别仅在于:
- malloc()可以在用户空间和内核空间中调用,并且它分配的是物理上碎片化的内存区域。 - 而kmalloc()只能在内核空间中调用,并且它分配的是物理上连续的内存块。
还是其他原因? kmalloc()使用指向虚拟或物理寻址的指针,与__get_free_pages()有何不同?

我非常确定在内核代码中调用的malloc()函数与用户代码中调用的malloc()函数不同,后者位于C标准库中,而该库未链接到内核。它们显然具有相同的名称,但仅此而已... - twalberg
1
你使用的操作系统是什么?我很想知道你在哪里读到了关于在内核空间中使用malloc函数的信息,假设你正在使用Linux。因为我从未读过在内核空间中可以使用kmalloc/vmalloc的malloc实现,这取决于驱动程序的要求... 而且,在用户空间中(glibc)的malloc甚至不是原语,因为它调用dlmalloc(),该函数调用mmap()或brk()。 在您发布后,我尝试在整个内核中搜索,并且只能在“用户级别工具”和“用户级别驱动程序”中找到malloc实现。 - Jekyll
2个回答

9
我来回答第二个问题,假设你正在使用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
谢谢!get_free_page() 会获取一个指针,该指针总是对齐到 PAGE_SIZE,而在 kmalloc() 中则相反,它获取的指针不对齐并且可能与其他指针位于同一页上,对吧? - Alex

2

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接