• 首页
  • 中国
  • OK6410A 开发板 (八) 36 linux-5.11 OK6410A 内存管理第四阶段

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

2023-11-01 176浏览
百检网是一家专业的第三方检测平台,汇聚众多拥有权威资质的第三方检测机构为你提供一站式的检测服务,做检测就上百检网。百检网让检测从此检测,一份报告全国通用,专业值得信赖。

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

}


百检网秉承“客户至上,服务为先,精诚合作,以人为本”的经营理念,始终站在用户的角度解决问题,为客户提供“一站购物式”的新奇检测体验,打开网站,像挑选商品一样简单,方便。打破行业信息壁垒,建构消费和检测机构之间高效的沟通平台