代码架构
kmalloc架构
kmalloc
|----->return __kmalloc(size, flags);
| |----->return __do_kmalloc(size, flags, _RET_IP_);
| | |----->return __do_kmalloc(size, flags, _RET_IP_);
| | | |----->cachep = kmalloc_slab(size, flags);
| | | | 根据size找到最合适的kmem cache实例
| | | |----->ret = slab_alloc(cachep, flags, caller);
| | | | 从slab中分配object
| | | | |----->objp = __do_cache_alloc(cachep, flags);
| | | | | |----->return ____cache_alloc(cachep, flags);
| | | | | | |----->ac = cpu_cache_get(cachep);
| | | | | | | 获取array cache,ac维护一组object cache
| | | | | | |----->objp = ac->entry[--ac->avail];
| | | | | | | 如果array cache有可用的object,则支持返回,否则调用
| | | | | | | cache_alloc_refill填充array cache,并分配object
| | | | | | |----->objp = cache_alloc_refill(cachep, flags);
| | | | | | | 该函数先查看slab中是否可以分配到object,如果没有则从buddy system
| | | | | | | 分配slab,并从slab中分配object,详情参考重要函数分析。
| | | | | | |----->return objp;
我们可以看到kmalloc是分配一个object,object size大于或等于需要分配的空间的size,所以这里会存在挺多的空间浪费。
kfree架构
kfree
|----->c = virt_to_cache(objp);
| 根据object地址找到kmem cache实例,详见重要函数分析。
|----->__cache_free(c, (void *)objp, _RET_IP_);
| |----->___cache_free(cachep, objp, caller);
| | |----->cache_flusharray(cachep, ac);
| | | 如果array_cache中的object已经达到上限,则调用该函数将array_cache中的object移入
| | | shared array cache或者slab中,详见重要函数分析
| | |----->ac->entry[ac->a