本文共 1313 字,大约阅读时间需要 4 分钟。
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 和 kfreeA 是什么 A 是 一系列 slab 实例的集合,是kmalloc 机制A 和 kmem_cache_init 的关系 kmem_cache_init 创建了 AA 和 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
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 }
转载地址:http://wjigi.baihongyu.com/