本文维护地址:http://blog.youkuaiyun.com/FreeeLinux/article/details/54511076
这篇博客来剖析一下 kmem_cache_create() 函数,就是所谓合成缓存器函数。
这个函数通常是在内核初始化时进行的,或者在首次加载模块时进行的。
struct kmem_cache *kmem_cache_create(const char* name, size_t size, size_t align, unsigned long flags,
void (*ctor)(void*, struct kmem_cache *, unsigned long), void (*dtor)(void *, struct kmem_cache *, unsigned long));
name 参数定义了缓存器的名称,proc 文件系统(可以 cat /proc/slabinfo 查看)使用它标识这个缓存。size 参数指定了这个缓存器负责分配的对象大小。align 参数定义了每个对象必须的对齐。flags 参数指定了为缓存启用的选项。
flags 的标志如图:
选项 | 说明 |
---|---|
RED_ZONE | 在对象头、尾插入标志,用来支持对缓冲区溢出的检查 |
SLAB_POISON | 使用一种已知模式(如0xa5a5a5a5)填充 slab,允许对缓存中的对象进行监视,不过可以在外部进行修改) |
SLAB_HWCACHE_ALIGN | 指定缓存对象必须与硬件缓存行对齐 |
ctor 和 dtor 是构造函数和析构函数,这不用说。
在创建缓存器之后,kmem_cache_create() 函数会返回对它的引用。注意这个函数并没有向缓存器提供任何用来分配对象内存。相反,在试图从缓存器(最初为空)分配对象时,会通过 cache_alloc_refill() 函数向伙伴系统申请内存。当所有对象都被分配出去后,可以再次这样做。
首先给出该函数的调用机制流程图: