D mm_init->mem_init返回 -> mm_init->kmem_cache_init返回
----此时slab建立,开启了基于 buddy内存管理器时代 的 slab内存管理器时代
kmem_cache_init
此过程以 slab 为基础,通过slab 的api kmem_cache_create , 创建 很多个 slab
假设这么多个slab 为 一个集合A
这么多slab 就是给用户用的,然后 这么多slab 的 alloc 和 free api 是什么呢?
针对某一个 slab, slab 提供了 kmem_cache_alloc 和 kmem_cache_free
那么 A 提供的用户的是封装了 kmem_cache_alloc 的 kmalloc 和 封装了 kmem_cache_free 和 kfree
A 是什么
A 是 一系列 slab 实例的集合,是kmalloc 机制
A 和 kmem_cache_init 的关系
kmem_cache_init 创建了 A
A 和 slab 的关系
A 是 一系列 slab 实例的集合
slab 并不是 一个内存管理器,而是一个内存管理API.
我们需要调用slab内存管理API,才可以建立一个slab存管理器实例.
一个slab管理器实例 对应 一个slab 句柄(struct kmem_cache * 类型变量)
slab 有其他实例吗?
有
实例1:
初始化:
struct kmem_cache * task_struct_cachep = kmem_cache_create_usercopy("task_struct"
alloc:
alloc_task_struct_node -> kmem_cache_alloc_node(task_struct_cachep, GFP_KERNEL
kmalloc机制 建立过程
kmem_cache_init
create_boot_cache(kmem_cache_node, "kmem_cache_node"
create_boot_cache(kmem_cache, "kmem_cache"
setup_kmalloc_cache_index_table
size_index[] = ... ;
create_kmalloc_caches
for (i = KMALLOC_SHIFT_LOW; i <= KMALLOC_SHIFT_HIGH; i++) {
new_kmalloc_cache(i, type, flags);
kmalloc_caches[type][idx] = create_kmalloc_cache( kmalloc_info[idx].name[type], kmalloc_info[idx].size, flags, 0, kmalloc_info[idx].size);
// kmalloc_info 是 全局变量,定义 name 与 size 相关
// mm/slab_common.c
}
百检网秉承“客户至上,服务为先,精诚合作,以人为本”的经营理念,始终站在用户的角度解决问题,为客户提供“一站购物式”的新奇检测体验,打开网站,像挑选商品一样简单,方便。打破行业信息壁垒,建构消费和检测机构之间高效的沟通平台