OK6410A 开发板 (八) 36 linux-5.11 OK6410A 内存管理第四阶段

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
		}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值