Slab对象的分配和回收kmem_bufctl_t的用法

在这里我介绍一下Slab对象的分配和回收kmem_bufctl_t的用法,首先要说明的一点
是Slab缓存的内存布局,Slab缓存分为两部分,一部分是用于管理Slab对象,另一
部分是Slab对象本身,针对这两部分内容,Slab缓存的内存布局大概有两种:
1. Slab对象同管理Slab对象的缓存一起存放。
2. 分开存放。

对于管理区分成2部分,一部分是描述Slab的数据结构,struct slab。另外一部分是用于
描述Slab对象的offset的一个数组,叫做kmem_bufctl_t。

管理区:Slab struct|kmem_bufctl_t array

如何取得kmem_bufctl_t数组的首地址:
static inline kmem_bufctl_t *slab_bufctl(struct slab *slabp)
{
 return (kmem_bufctl_t *) (slabp + 1);
}
从代码上很容易看清楚,这个数组是存放在Slab struct之后的。

对于Slab struct中的一个字段free是用来记录当前可用的object的一个索引值。

我们来看一下Slab对象分配函数
static void *slab_get_obj(struct kmem_cache *cachep, struct slab *slabp, int nodeid)
{
  s_mem是指向Slab对象的内存起始地址,buffer_size是对象的大小包括colour offset.
 void *objp = slabp->s_mem + (slabp->free * cachep->buffer_size);
 kmem_bufctl_t next;

 slabp->inuse++;
 取得当前可用的Slab对象的位置。
 next = slab_bufctl(slabp)[slabp->free];
  将当前可用的slab对象的位置下移一个。
 slabp->free = next;

 return objp;
}

再来看一下Slab对象的释放函数
static void slab_put_obj(struct kmem_cache *cachep, struct slab *slabp, void *objp,
     int nodeid)
{
  首先求的Slab对象的索引值。
 unsigned int objnr = (unsigned)(objp-slabp->s_mem) / cachep->buffer_size;

  根据索引值在kmem_bufctl_t中寻找将要释放对象的kmem_bufctl_t数组中的位置的值,将下一个
  对象的索引值付值给他。即将要释放的对象插回数组。
 slab_bufctl(slabp)[objnr] = slabp->free;
 重置当前可以供分配的索引值
 slabp->free = objnr;
 slabp->inuse--;
}

最后再来看一下初始化Slab对象的函数
static void cache_init_objs(struct kmem_cache *cachep,
       struct slab *slabp, unsigned long ctor_flags)
{
 int i;

 for (i = 0; i < cachep->num; i++) {
  void *objp = slabp->s_mem + cachep->buffer_size * i;
  如果存在构造函数,需要调用构造函数
  if (cachep->ctor)
   cachep->ctor(objp, cachep, ctor_flags);
  当前Slab对象的bufferctl值为下一个Slab的索引值。
  slab_bufctl(slabp)[i] = i + 1;
 }
 
 slab_bufctl(slabp)[i - 1] = BUFCTL_END;
 当前可用的Slab对象的索引值为0,表示第一个对象
 slabp->free = 0;
}

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值