1. kmalloc分配内存的大小 本文基于linux-5.15分析,linux-6.6已经删除slob,后续也会将slab移除。 kmalloc会根据申请的内存大小来决定来决定使用块分配器(slab/slub/slob)或页分配器进行内存分配。 控制kmalloc分配行为的主要有如下三个宏。 macrodesc KMALLOC_MAX_SIZE kmalloc可以分配的最大内存,超过此大小时返回NULL...
slab是kmalloc的基础,kmalloc使用上面讲到的通用slab缓存来分配空间。 void *kmalloc(size_t size,gfp_t flags); kmalloc可分配的最大size由KMALLOC_MAX_SIZE定义,这个值在2^25B和buddy的最大分配阶之间取一个小值。 #defineKMALLOC_SHIFT_HIGH ((MAX_ORDER +PAGE_SHIFT - 1) <= 25 ? \ (MAX_ORDER + PA...
这里我们可以看到当申请大小大于KMALLOC_MAX_CACHE_SIZE时调用的是kmalloc_large(),kmalloc_large是直接通过buddy system申请物理页的,而KMALLOC_MAX_CACHE_SIZE的大小是2倍的物理页的大小,也就是8k 通过kmalloc_slab()根据大小得到对应的kmem_cache,大致浏览kmalloc_slab函数,我们发现他其实是通过size_index将大小转化...
#if KMALLOC_MAX_SIZE >= 1048576 CACHE(1048576) #endif #if KMALLOC_MAX_SIZE >= 2097152 CACHE(2097152) #endif #if KMALLOC_MAX_SIZE >= 4194304 CACHE(4194304) #endif #if KMALLOC_MAX_SIZE >= 8388608 CACHE(8388608) #endif #if KMALLOC_MAX_SIZE >= 16777216 CACHE(16777216) #endif #if KMALLO...
既然kmalloc 体系中通用内存块的尺寸分布信息可以通过一个数组 kmalloc_info[] 来定义,那么同理,最佳内存块尺寸的选取规则也可以被定义在一个数组中。 内核通过定义一个size_index[24]数组来存放申请内存块大小在 192 字节以下的 kmalloc 内存池选取规则。
static __always_inline void*kmalloc(size_t size,gfp_t flags) { struct kmem_cache*cachep; void*ret; if(__builtin_constant_p(size)){ inti=0; if(!size) return ZERO_SIZE_PTR; #define CACHE(x)\ if(size=x)\ goto found;\ else\ ...
CACHE(131072)#ifKMALLOC_MAX_SIZE >= 262144CACHE(262144)#endif#ifKMALLOC_MAX_SIZE >= 524288CACHE(524288)#endif#ifKMALLOC_MAX_SIZE >= 1048576CACHE(1048576)#endif#ifKMALLOC_MAX_SIZE >= 2097152CACHE(2097152)#endif#ifKMALLOC_MAX_SIZE >= 4194304CACHE(4194304)#endif#ifKMALLOC_MAX_SIZE >= 8388608...
kmalloc()是基于slab/slob/slub分配分配算法上实现的,不少地方将其作为slab/slob/slub分配算法的入口,实际上是略有区别的。 现在分析一下其实现: 1. 【file:/include/linux/slab.h】 2. /** 3. * kmalloc - allocate memory 4. * @size: how many bytes of memory are required. ...
192 等字节尺寸的内存块对应的最佳 slab cache 选取规则也是如此,都是通过 size_index 数组中的值找到 kmalloc_info 数组的索引,然后通过 kmalloc_info[index] 指定的 slab cache,分配对应尺寸的内存块。 size_index 数组只是定义申请内存块在 192 字节以下的 kmalloc 内存池选取规则,当申请内存块的尺寸超过 192 ...
本文介绍Linux内核内存分配函数kmalloc。 一、定义 static__always_inlinevoid*kmalloc(size_t size,gfp_t flags){if(__builtin_constant_p(size)){if(size>KMALLOC_MAX_CACHE_SIZE)returnkmalloc_large(size,flags);#ifndefCONFIG_SLOBif(!(flags&GFP_DMA)){intindex=kmalloc_index(size);if(!index)returnZER...