kmalloc,vmalloc , malloc

kmalloc,vmalloc分配都是以字节为单位

(1) kmalloc

1 void * kmalloc(size_t size, gfp_t flags)

该函数返回的是一个指向内存块的指针,其内存块大小至少为size,所分配的内存在物理内存中连续且保持原有的数据(不清零)

其中部分flags取值说明:

  • GFP_USER: 用于用户空间的分配内存,可能休眠;
  • GFP_KERNEL:用于内核空间的内存分配,可能休眠;
  • GFP_ATOMIC:用于原子性的内存分配,不会休眠;典型原子性场景有中断处理程序,软中断,tasklet等

kmalloc内存分配最终总是调用__get_free_pages 来进行实际的分配,故前缀都是GFP_开头。 kmalloc分最多只能分配32个page大小的内存,每个page=4k,也就是128K大小,其中16个字节用来记录页描述结构。kmalloc分配的是常驻内存,不会被交换到文件中。最小分配单位是32或64字节。

kzalloc

kzalloc()等价于先用 kmalloc() 申请空间, 再用memset()来初始化,所有申请的元素都被初始化为0。

1 static inline void *kzalloc(size_t size, gfp_t flags)
2 {
3     return kmalloc(size, flags | __GFP_ZERO); //通过或标志位__GFP_ZERO,初始化元素为0
4 }

(2) vmalloc

1 void * vmalloc(unsigned long size)

该函数返回的是一个指向内存块的指针,其内存块大小至少为size,所分配的内存是逻辑上连续的。

kmalloc不同,该函数乜有flags,默认是可以休眠的。

小结:

分配函数区域连续性大小释放函数优势
kmalloc 内核空间 物理地址连续 最大值128K-16 kfree 性能更佳
vmalloc 内核空间 虚拟地址连续 更大 vfree 更易分配大内存
malloc 用户空间 虚拟地址连续 更大 free  
原文地址:https://www.cnblogs.com/zongfanstudy/p/13389159.html