一般我们会用到 kmalloc()、kzalloc()、vmalloc() 等,下面我们介绍一下这些函数的使用以及它们之间的区别。
kmalloc()
函数原型: 1
void *kmalloc(size_t size, gfp_t flags);
对应的内存释放函数为: 1
void kfree(const void *objp);
1
2
3
4
5
6
7
8
9/**
* kzalloc - allocate memory. The memory is set to zero.
* @size: how many bytes of memory are required.
* @flags: the type of memory to allocate (see kmalloc).
*/
static inline void *kzalloc(size_t size, gfp_t flags)
{
return kmalloc(size, flags | __GFP_ZERO);
}
vmalloc()
函数原型: 1
void *vmalloc(unsigned long size);
对应的内存释放函数为: 1
void vfree(const void *addr);
总结
kmalloc()、kzalloc()、vmalloc() 的共同特点是: + 用于申请内核空间的内存; + 内存以字节为单位进行分配; + 所分配的内存虚拟地址上连续;
kmalloc()、kzalloc()、vmalloc() 的区别是: + kzalloc 是强制清零的 kmalloc 操作;(以下描述不区分 kmalloc 和 kzalloc) + kmalloc 分配的内存大小有限制(128KB),而 vmalloc 没有限制; + kmalloc 可以保证分配的内存物理地址是连续的,但是 vmalloc 不能保证; + kmalloc 分配内存的过程可以是原子过程(使用 GFP_ATOMIC),而 vmalloc 分配内存时则可能产生阻塞; + kmalloc 分配内存的开销小,因此 kmalloc 比 vmalloc 要快;
一般情况下,内存只有在要被 DMA 访问的时候才需要物理上连续,但为了性能上的考虑,内核中一般使用 kmalloc(),而只有在需要获得大块内存时才使用 vmalloc()。例如,当模块被动态加载到内核当中时,就把模块装载到由 vmalloc() 分配的内存上