有哪些不同的功能:malloc()
和kmalloc()
?
它们的区别仅在于:
malloc()
可以在用户空间和内核空间中调用,并且它会分配一个物理碎片化的内存区域kmalloc()
只能在内核空间中调用,并且它会分配物理上连续的内存块或其他什么?
kmalloc()
在虚拟或物理寻址中使用指针以及kmalloc()
与__ get_free_pages()
的不同之处?
答案 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_page
和kmalloc
非常相似。 _get_free_pages
与get_free_page
不同,因为它指向内存区域的第一个字节,该内存区域可能是 几个(物理上连续的)页面 长。
另一个与get_free_page
非常相似的函数是get_zeroed_page(unsigned int flags)
,它会获得像get_free_page
这样的单个页面,但会将内存归零
答案 1 :(得分:0)