摘要: kmalloc的实现 kmalloc的基础是一个数组,其中是一些分别用于不同内存长度的slab缓存。数组项是cache_sizes的实例,该数据结构定义如下: <slab_def.h> struct cache_sizes { size_t cs_size; kmem_cache_t *cs_cac 阅读全文
posted @ 2022-03-23 00:43 while(true);; 阅读(61) 评论(0) 推荐(0) 编辑
摘要: 如果一个分配的对象已经不再需要,那么必须使用kmem_cache_free返回给slab分配器。图3-52给出了该函数的代码流程图。 类似于分配,根据per-CPU缓存的状态不同,有两种可选的操作流程。如果per-CPU缓存中的对象数目低于允许的限制,则在其中存储一个指向缓存中对象的指针。 mm/s 阅读全文
posted @ 2022-03-23 00:20 while(true);; 阅读(95) 评论(0) 推荐(0) 编辑
摘要: kmem_cache_alloc用于从特定的缓存获取对象。类似于所有的malloc函数,其结果可能是指向分配内存区的指针,也可能分配失败,返回NULL指针。该函数需要两个参数:用于获取对象的缓存,以及精确描述分配特征的标志变量。 <slab.h> void *kmem_cache_alloc (km 阅读全文
posted @ 2022-03-22 23:55 while(true);; 阅读(477) 评论(0) 推荐(0) 编辑
摘要: 创建新的slab缓存必须调用kmem_cache_create。该函数需要很多参数。 mm/slab.c struct kmem_cache *kmem_cache_create (const char *name, size_t size, size_t align,unsigned long f 阅读全文
posted @ 2022-03-22 21:51 while(true);; 阅读(378) 评论(0) 推荐(0) 编辑
摘要: 1. 数据结构 每个缓存由kmem_cache结构的一个实例表示,该结构的内容如下 mm/slab.c struct kmem_cache { /* 1) per-CPU数据,在每次分配/释放期间都会访问 */ struct array_cache *array[NR_CPUS]; /* 2) 可调 阅读全文
posted @ 2022-03-22 20:01 while(true);; 阅读(106) 评论(0) 推荐(0) 编辑
摘要: 基本上,slab缓存由图3-44所示的两部分组成:保存管理性数据的缓存对象和保存被管理对象的各个slab。 每个缓存只负责一种对象类型(例如struct unix_sock实例),或提供一般性的缓冲区。各个缓存中slab的数目各有不同,这与已经使用的页的数目、对象长度和被管理对象的数目有关。 1. 阅读全文
posted @ 2022-03-22 18:53 while(true);; 阅读(584) 评论(0) 推荐(0) 编辑
摘要: 内核也必须经常分配内存,但无法借助于标准库的函数。上面描述的伙伴系统支持按页分配内存,但这个单位太大了。如果需要为一个10个字符的字符串分配空间,分配一个4 KiB或更多空间的完整页面,不仅浪费而且完全不可接受。 提供小内存块不是slab分配器的唯一任务。由于结构上的特点,它也用作一个缓存,主要针对 阅读全文
posted @ 2022-03-22 18:18 while(true);; 阅读(139) 评论(1) 推荐(0) 编辑
摘要: 根据上文的讲述,我们知道物理上连续的映射对内核是最好的,但并不总能成功地使用。在分配一大块内存时,可能竭尽全力也无法找到连续的内存块。在用户空间中这不是问题,因为普通进程设计为使用处理器的分页机制,当然这会降低速度并占用TLB。在内核中也可以使用同样的技术。 如图3-37所示,在IA-32系统中,紧 阅读全文
posted @ 2022-03-21 20:32 while(true);; 阅读(149) 评论(0) 推荐(0) 编辑
摘要: __free_pages是一个基础函数,用于实现内核API中所有涉及内存释放的函数。其代码流程图如图3-35所示。 __free_pages首先判断所需释放的内存是单页还是较大的内存块?如果释放单页,则不还给伙伴系统,而是置于per-CPU缓存中,对很可能出现在CPU高速缓存的页,则放置到热页的列表 阅读全文
posted @ 2022-03-21 00:20 while(true);; 阅读(223) 评论(0) 推荐(0) 编辑
摘要: 如果内核找到适当的内存域,具有足够的空闲页可供分配,那么还有两件事情需要完成。首先它必须检查这些页是否是连续的(到目前为止,只知道有许多空闲页)。其次,必须按伙伴系统的方式从free_lists移除这些页,这可能需要分解并重排内存区。内核将该工作委托给前一节提到的buffered_rmqueue。图 阅读全文
posted @ 2022-03-20 21:58 while(true);; 阅读(65) 评论(0) 推荐(0) 编辑