有什么不同的功能:malloc()
和kmalloc()
?
它们的不同之处仅在于:
malloc()
,它分配物理上分散的内存区域kmalloc()
只能在内核空间中调用,它分配物理上连续的内存块或者是其他东西?
kmalloc()
在虚拟或物理寻址中使用指针,什么kmalloc()
与__ get_free_pages()
不同? 最佳答案
假设您使用的是Linux OS,我将回答第二个问题。关于第一个,请看一下我的评论。kmalloc
使用get_free_page
获取内存。收集页面的方式取决于第二个参数(GFP_ATOMIC GFP_KERNEL ...
,其中GFP表示获取免费页面)。 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_page
和kmalloc
非常相似。 _get_free_pages
与get_free_page
有所不同,因为它为存储区的第一个字节提供了指针,该存储区的长度可能为几个(物理上连续的)页长。另一个与
get_free_page
非常相似的功能是get_zeroed_page(unsigned int flags)
,它获得像get_free_page
这样的单个页面,但将内存清零