【Linux 内核】1 kmalloc函数

kmalloc函数用于在Linux内核中分配内存,根据传入的size参数进行适配,可能大于请求大小。它涉及伙伴系统和slab缓存,并通过不同标志如__GFP_DMA、__GFP_HIGHMEM进行内存区域和优先级控制。当无法满足分配时,可以通过__GFP_REPEAT、__GFP_NOFAIL和__GFP_NORETRY标志调整行为。最终,内存分配由__cache_alloc()执行,其大小取决于L1缓存大小和其他内核配置。

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

函数原型

#include Linux/slab.h> 
void *kmalloc(size_t size, int flags); 

size是要分配内存的大小,不过内核会对大小进行适配,比如取32,64等等,是和缓存行等体系结构有关系的,总之可能会比你要申请的内存大一些。 
flags是与伙伴系统交互的标记,虽说kmalloc()是从slab分配内存,不过底层还是要和伙伴系统交互的。

flags标记:

上面这些标志底层是组合了下面这些标志实现的: 
__GFP_DMA 
这个标志要求分配在能够 DMA 的内存区. 确切的含义是平台依赖
__GFP_HIGHMEM 
这个标志指示分配的内存可以位于高端内存. 
__GFP_COLD 
正常地, 内存分配器尽力返回”缓冲热”的页 – 可能在处理器缓冲中找到的页. 相反, 这个标志请求一个”冷”页, 它在一段时间没被使用. 它对分配页作 DMA 读是有用的, 此时在处理器缓冲中出现是无用的. 
__GFP_NOWARN 
这个很少用到的标志阻止内核来发出警告(使用 printk ), 当一个分配无法满足. 
__GFP_HIGH 
这个标志标识了一个高优先级请求, 它被允许来消耗甚至被内核保留给紧急状况的最后的内存页. 
__GFP_REPEAT 
__GFP_NOFAIL 
__GFP_NORETRY 
这些标志修改分配器如何动作, 当它有困难满足一个分配. __

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值