【1000个Linux内存知识-014】-内核中kmalloc到底是怎么从slab分配内存的?都是从slab分配的吗?

本文详细探讨了Linux内核中的kmalloc内存分配机制,涉及kmalloc在slub下的工作原理,如何根据内存大小选择分配器(小于4KB使用kmemcache,大于4KB使用伙伴系统),以及kmemcache的结构和使用过程。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

前沿

本文只讨论slub下的kmalloc机制。

kmalloc在哪定义? slab.h

在这里插入图片描述

KMALLOC_MAX_CACHE_SIZE是多大? 4KB

在这里插入图片描述

大于4KB的内存需求kmalloc用什么分配?

if (size > 4KB)
			return kmalloc_large(size, flags);

具体流程:
在这里插入图片描述
alloc_pages 直接从伙伴系统拿

|-kmalloc(size_t size, gfp_t flags)
|----kmalloc_large(size, flags);
|-------get_order(size);
|-------alloc_pages(flags, order);

小于4KB的内存需求kmalloc用什么分配?

从kmalloc cache中分配,kmalloc cache是多个slab节点的kmem cache
详细参考文章:《【1000个Linux内存知识-013】-关于kmalloc分配内存使用的kmalloc cache的全局表kmalloc_caches和kc名字表kmalloc_info》
简单信息如下:

关于kmalloc_caches

kmalloc_caches是一个二维数组指针:
第一维 总的3个类型(nomal reclaim dma)
第二维 每类13个(page_order+1) kmem_cache,每个kmem_cache是负责一些数据大小的内存分配,比如小于8字节的就在第三个kmem_cache(具体待研究)
在这里插入图片描述

三种kmalloc cache的数量:

graph LR
3种kmalloc cache --> KMALLOC_NORMAL
3种kmalloc cache --> KMALLOC_RECLAIM
3种kmalloc cache --> KMALLOC_DMA

在这里插入图片描述

关于kmalloc_cache中每类13个kmem_cache与实际需要分配的size大小的对应关系

每个kmem_cache是负责一些数据大小的内存分配,比如小于8字节的就在第三个。
在这里插入图片描述
size_index表示 size对应的index的mapping获取,只是size_index进行了8个字节的压缩。也就是1-8是同一个mapping。
在这里插入图片描述
为什么找一个size对应的kmem_cache要整这么麻烦?
为什么要按照192进行区隔开?
以后完善。

kmalloc具体分配小于4K的流程

|-kmalloc(size_t size, gfp_t flags)
|----__kmalloc(size_t size, gfp_t flags) //小于4KB
|-------kmalloc_large(size, flags);
|-----------struct kmem_cache *s = kmalloc_slab(size, flags); //获取slab cache
|-----------slab_alloc(s, flags, _RET_IP_); 分配

可以看到主要原理就是通过size找到对应的kmem_cache,然后用slab_alloc从cache中分配内存。
slab的四部曲create destory alloc free参考其他文章

综述

  • 内核中kmalloc根据size大小选择不同分配器,小于4K从kmalloc cache,大于4K从伙伴系统
  • kmalloc cache是从slab预分配的零售商,有3*13-39个kmem cache,kmalloc根据size大小决定使用哪个kmem cache
  • kmalloc的cache类型是kmem cache,存在kmalloc_caches全局表中
  • kmalloc_caches表每个slab对象kmem cache里面的obj大小相似,比如kmalloc-8都是1-8大小的内存块。
  • kmalloc不全是从slab分配,也会从伙伴直接分配
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值