Linux内核内存分配函数之kmalloc

Linux内核内存分配函数之kmalloc,第1张

本文介绍Linux内核内存分配函数 kmalloc 。

注:

1) __builtin_constant_p 编译器内联函数,判断传入参数是否为常量。如果是变量,直接调用 __kmalloc 函数。

2) KMALLOC_MAX_CACHE_SIZE 表示系统创建 slab cache 的最大值为8K,定义如下:

RockPI 4A Linux内核使能 ARM64_4K_PAGES 。可使用命令 getconf 查看 page size ,具体如下:

3) kmalloc 一般用于小内存分配,RockPI 4A Linux内核基于 slub ( CONFIG_SLUB=y )实现。系统先用页分配器分配以页为最小单位的连续物理地址,然后 kmalloc 在此基础上根据调用者的需要进行切分。如果分配超过 KMALLOC_MAX_CACHE_SIZE ,则使用 kmalloc_large 进行大内存分配,即调用页分配器分配内存。( 后续仔细学习

4) kmalloc 分配的内存在物理上连续,可用于DMA设备。 vmalloc 分配的内存是线性地址连续,物理地址不连续,不可用于DMA设备。

size :分配内存的大小,以字节为单位;

flags :分配内存的类型,包括:

1) GFP_USER :可能会引起休眠,用于为用户空间分配内存。

2) GFP_KERNEL :可能会引起休眠,用于内核内存正常分配。

3) GFP_ATOMIC :不会引起休眠,可用于中断处理程序中内存分配。

4) GFP_HIGHUSER :从高端内存中分配内存。

5) GFP_DMA :用于DMA内存分配。

6)其它类型见: include/linux/gfp.h

GFP 可理解为 get free page 。

返回分配内存的首地址,是虚拟地址(线性地址)。

正所谓有借有还,再借不难。每次 kmalloc ,都要有对应的内存释放函数 kfree 。定义文件: mm/slub.c ,如下:

本文介绍Linux内核内存分配函数: kzalloc() 和 kcalloc() 。

文件: include/linux/slab.h ,定义如下:

kzalloc() 函数功能同 kmalloc() 。区别:内存分配成功后清零。

每次使用 kzalloc() 后,都要有对应的内存释放函数 kfree() 。

举例:

文件: include/linux/slab.h ,定义如下:

kcalloc() 函数为数组分配内存,大小 n*size ,并对分配的内存清零。该函数的最终实现类似 kmalloc() 函数。

每次使用 kcalloc() 后,都要有对应的内存释放函数 kfree() 。

举例:


欢迎分享,转载请注明来源:内存溢出

原文地址:https://54852.com/yw/7369520.html

(0)
打赏 微信扫一扫微信扫一扫 支付宝扫一扫支付宝扫一扫
上一篇 2023-04-04
下一篇2023-04-04

发表评论

登录后才能评论

评论列表(0条)

    保存