1、页面分配器是页面级的内存分配工具,能分配2的order次幂的连续物理内存。
linux在页面级内存分配的基础上,开发了小内存分配方案--slab、slob、slub。
后两者分別针对大型系统和嵌入式系统。
2、slab分配器的思想
先利用页面分配器分配出单个或者一组连续的物理页面,然后在此基础上将整块页面分割成多个相等的小内存单元,以满足小内存空间分配的需要。
3、slab的数据结构
struct kmem_cache
struct slab
malloc_sizes[]
他们的结构关系如下图:
4、kmalloc kzalloc
void *kmalloc(size_t size, gfp_t flags)
代码流程:现利用size参数在malloc_sizes数组中找到大于等于size的值,通过它找到一个对应的slab分配器的kmem_cache,然后在它上面分配内存。
不会分配ZONE_HIGHMEM区域的内存。
static inline void *kzalloc(size_t size, gfp_t flags)
把分配出来的内存清零
5、kcalloc
static inline void *kcalloc(size_t n, size_t size, gfp_t flags)
6、kfree
void kfree (const void *objp)
代码流程:根据要释放的内存指针objp调用virt_to_page来获得objp所在页面对象的指针*page
调用_cache_free来释放内存。