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 |