kmem_cache
0. 简介
kmem_cache_xxx()是linux kernel提供的申请小内存(8B, 16B, 32B...4096B, 8192B)的API,一般用法:
#include <linux/slab.h>
cachep = kmem_cache_create(name, size, align, flags, ctor_func);
objp = kmem_cache_alloc(cachep, GFP_KERNEL);
...
kmem_cache_free(cachep, objp);
kmem_cache_destroy(cachep);通过kmem_cache_create()申请一个名字为name、object大小为size、以align对齐的kmem_cache类型的变量,然后调用kmem_cache_alloc()从kmem_cache中申请一个object;
通过kmem_cache_free()释放之前申请到的object,然后调用kmem_cache_destroy()释放kmem_cache类型的变量
我们平时通过kmalloc()/kfree()申请/释放小内存时,就是通过kmem_cache实现的
1. 分析源码
我们使用kmem_cache_xxx()时会通过#include <linux/slab.h>导入函数的原型,但是在导入函数原型前,需要通过配置CONFIG_SLUB、CONFIG_SLOB来选择小内存分配算法,如下:
/* include/linux/slab.h */
#ifdef CONFIG_SLUB
#include <linux/slub_def.h>
#elif defined(CONFIG_SLOB)
#include <linux/slob_def.h>
#else
#include <linux/slab_def.h>
#endif通过查找.config或include/generated/autoconf.h,可知目前使用slub分配器进行小内存分配。
1.1 创建kmem_cache
kmem_cache_create()定义,如下:
首先通过kmalloc()申请kmem_cache,再调用kmem_cache_open()进行初始化,然后将kmem_cache放入slab_caches链表,并且调用sysfs_slab_add()创建/proc/slabinfo相关条目,最后返回kmem_cache
1.2 删除kmem_cache
kmem_cache_destroy()定义,如下:
首先将kmem_cache从slab_caches链表中删除,然后调用kmem_cache_close()释放kmem_cache相关资源,最后调用sysfs_slab_remove()删除/proc/slabinfo相关条目
1.3 从kmem_cache中分配object
kmem_cache_alloc()定义,如下:
调用slab_alloc()从slab中分配一个object并且返回。如果没有可用的slab,使用gfpflags标志分配新slab
1.4 从kmem_cache中释放object
kmem_cache_free()定义,如下:
通过virt_to_head_page()从 x 获得slab的首页地址page,然后调用slab_free()
Last updated
Was this helpful?