Linux 内存管理:Kmem_cache_init

之前多多少少接触过cache之类的东西,总觉的很神秘,当然cache就是为了读写内存更高效。比如查看meminfo或者slabinfo的时候,你是否真的对内存机制理解的很清晰?
参考内核linux 3.8.13

我们看看调用它的函数接口:

这个函数在start_kernel里调用. 下面我们就看看 kmem_cache_init(); //默认slab分配器

第一行来自一个全局的指针变量,即为创建第一个cache( kmem_cache)
在mm/slab_common.c中
struct kmem_cache *kmem_cache;

创建的所有cache都会挂在LIST_HEAD(slab_caches); 这个全局链表上.在cat /proc/slabinfo可以查看》
这里可以看看struct kmem_cache:在slab_def.h中

这个结构体里面几个关键的元素之前在kmalloc里已经说到了。
而kmem_cache_boot则是:

注释解释的已经很清晰了.

而setup_nodelists_pointer的作用就是把struct kmem_cache里array指针地址存放在nodelists.目的是为了便于操作指针.
对于一致性内存访问,inode只有一个.

它是slab.c中静态全局变量

kmem_list3_init初始化slab的三个链表slabs_full、slabs_partial、slabs_free.为什么初始化这个和cache组成结构有关系,可以看个图:

这里CACHE_CACHE在文件的开头部分被定义为0.

接着就要开始了真正的创建cache的工作,并且给出了初始化步骤和说明:

首先创建第一个cache它名为kmem_cache,并且kmem_cache指针变量指向了kmem_cache_boot.
下面我们看看create_boot_cache函数

而它接着调用了__kmem_cache_create:这是最关键的函数

它里面有个很有趣的函数很关键的一个函数:它泄露了slab具体管理obj的布局和方法.

经过上面的初始化和设置,最后调用setup_cpu_cache就完成了一个创建cache的工作.接着进行第2、3步的工作:

这里在说一下cache_names和malloc_sizes:

这里就不扩展开了.

create_kmalloc_cache实际上是调用create_boot_cache. 把kernel预定义的通用cache创建一遍.之后我们进入第四步、第5步:

最后把slab_state状态设置为up 即已经可以正常使用了。虽然上面大部分是代码,具体申请内存的流程前面kmalloc已经讲过了。仅仅是为了弄明白cache到底是个什么玩意,以及如何初始化的。

在kmem_cache_init后,还有一个kmem_cache_init_late函数.
它主要是调用了enable_cpucache和注册一个cpu通知连

还记不记得之前我们分析batchcount的时候的矛盾点?

它会根据obj size 计算limit值 ,再去计算batchcount的值.

这个只是一个小小的开始吧,内存管理本来就博大精深,只有遇到具体问题具体分析,来加深理解了.

1 3 收藏 评论

相关文章

可能感兴趣的话题



直接登录
跳到底部
返回顶部