slab源码分析--缓存器的创建

本文维护地址: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() 函数向伙伴系统申请内存。当所有对象都被分配出去后,可以再次这样做。

首先给出该函数的调用机制流程图:

Created with Raphaël 2.1.0 kmem_cache_create()函数:创建缓存器 kmem_cache_zalloc()函数:申请缓存器缓存 __cache_alloc()函数:kmem_cache_alloc和kmalloc申请内存的总接口 __do_cache_alloc()函数:转调函数 ____cache_alloc()函数:申请缓存的核心函数 ac=cpu_cache_get()函数,获得本地缓存 if(av->avail),本地缓存足够 取ac末尾最热数据,objp=ac->entry[--ac->avail] 缓存器缓存申请成功 cache_alloc_refill(),重新填充 if(ls->shared),本地共享缓存足够 transfer_objects()函数,本地共享缓存转给本地缓存 成功向ac中转移了至少一个可用对象 retry:在三链中搜寻可分配对象 三链中有空闲对象 cache_grow()函数,从伙伴系统获取
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值