slab原理总结

slab详解:

https://blog.csdn.net/cosmoslhf/article/details/42743101

总结:

内存分为静态内存和动态内存,静态内存在编译的时候内存就分配好了,这里主要讲的是动态分配内存。kmalloc分配内存时是根据所要的大小在malloc_sizes的数组里寻找与之大小相匹配的stuct kmem_cache对象,再在stuct kmem_cache对象里去找它的成员变量struct array_cache,如果该成员变量有空闲内存,就从其里面取,如果没有空闲内存,则struct array_cache成员变量会从stuct kmem_cache对象的另一个成员变量struct kmem_list3(即slab三链)里找,如果slab三链里的完全空闲和部分空闲链里有空余内存对象,就从里面取出空余内存对象给到struct array_cache成员变量,再由struct array_cache成员变量向上返回。1个stuct kmem_cache对象里有n个struct slab对象,这些struct slab对象表示同一种内存大小,并且被slab三链管理着。一个struct slab对象里有1个物理页,该物理页又被等分成n个相等大小的内存对象。当slab三链中也没有空余内存,它会创建一个 stuct slab对象,该对象里的n个内存对象会被分到L3三链里的完全空闲链里,这样就有空余内存。 【注:malloc_sizes数组的数据类型是struct cache_sizes,它有两个数据成员,即cs_size(数据类型size_t)和cs_cachep(数据类型是struct kmem_cache*),cs_size值以32,64,128,256.........依次递增,每个大小值都有对应的stuct kmem_cache对象。stuct kmem_cache对象有两个重要成员变量,一个是struct array_cache,另一个是struct kmem_list3,成员变量本身也是需要存储空间的。】,这样就有n个kmem_cache对象,这些对象的内存肯定又需要slab机制分配,为此,我们首先得要创建能够批量生产n个kmem_cache对象的slab规则。因为这时候该大小slab机制还没建立,而且这时候是处于最原始状态,即什么都没有,所以第一个stuct kmem_cache对象指向的是静态全局变量cache_cache(类型struct kmem_cache),它的struct array_cache对象和struct kmem_list3对象都分别指向与之对应的静态变量,然后接着创建一个struct slab对象,分配一个物理页给它,该物理页又被等分成n个stuct kmem_cache大小的内存空间,等到该stuct slab对象创建完成之后,将它被添加到slab三链里,最后给到struct array_cache对象里,这样就能批量生产stuct kmem_cache对象了。于是我们分别批量生产了struct array_cache大小和slab三链大小以及32,64,128等等不同大小的kmem_cache对象(即上面的malloc_sizes数组)。然而在生产struct array_cache大小和slab三链大小的kmem_cache对象过程中,由于该大小的kmem_cache对象正在创建,还没创建好,所以不能用该规则去生产它的成员对象struct array_cache和slab三链,只能还得用静态变量替代。

细节:

slab_bufctl函数返回下一个struct slab对象的地址,也就是当前对象的地址+struct slab的大小,kmem_bufctl_t=====unsigned int;

static inline kmem_bufctl_t *slab_bufctl(struct slab *slabp)
{
    return (kmem_bufctl_t *) (slabp + 1);
}

下一个struct slab对象的地址+i处赋值i+1,该值是int型

slab_bufctl(slabp)[i] = i + 1;

下一个struct slab对象的地址+slabp->free处取值,该值是int型

next = slab_bufctl(slabp)[slabp->free];

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值