linux内核中的devm_kzalloc

24 篇文章 1 订阅
22 篇文章 4 订阅

linux内核中的内存分配

1、devm_kzalloc & devm_kfree

函数devm_kzalloc和kzalloc一样都是内核内存分配函数,但是devm_kzalloc是跟设备(装置)有关的,当设备(装置)被拆卸或者驱动(驱动程序)卸载(空载)时,内存会被自动释放。另外,当内存不再使用时,可以使用函数devm_kfree()释放。而kzalloc没有自动释放的功能,用的时候需要小心使用,如果忘记释放,会造成内存泄漏。
函数原型为

void * devm_kzalloc (struct device * dev, size_t size, gfp_t gfp);

dev
Device to allocate memory for
申请内存的目标设备。
size
Allocation size
申请的内存大小
gfp
Allocation gfp flags
申请内存的类型标志

2、kmalloc & kfree

分配的内存物理上连续(虚拟上也连续),只能在低端内存分配(直接内存映射区)。

void *kmalloc(size_t size, gfp_t gfp)

size: 待分配内存大小(按字节计算)
gfp: 分配标志,用于控制kmalloc行为。

3、get_zeroed_page & free_page

unsigned long get_zeroed_page(gfp_t gfp_mask);

gfp: 分配标志,用于控制kmalloc行为。
基于kmalloc实现。
分配的内存物理上连续,分配一个页面(4K),并且该页面内容被清零,只能在低端内存分配。

4、__get_free_pages & free_pages

unsigned long __get_free_pages(gfp_t gfp_mask, unsigned int order);

gfp_mask: 分配标志,用于控制kmalloc行为
order: 请求或者释放的页数的2的幂,例如:操作1页,该值为0,操作16页该值为4.如果该值太大会寻址分配失败,该值允许的最大值依赖于体系结构。
分配的内存物理上连续,分配指定页数的底端内存。(如果分配太大内存几百兆或者上G的内存,一般可以通过Uboot启动参数来实现(bootmemory)。

int get_order(unsigned long size)

size: 需要计算order值的大小(按字节计算)
返回:__get_free_pages等函数需要的order值

5、alloc_pages & __free_pages

分配的内存物理上连续,分配指定页数的内存,可以从高端内存,也可以从底端内存分配,通过宏指定。

6、 vmalloc & vfree

void *vmalloc(unsigned long size);

size:待分配的内存的大小,自动按页对齐。
默认在动态内存映射区分配。分配的内存在内核空间中连续(虚拟连续),物理上无需连续。vmalloc由于不需要物理上也连续,所以性能很差,一般只有在必须申请大块内存时才使用,例如动态插入模块时。

7、内存分配标志

1、GFP_KERNEL:

表示该次内存 分配由内核进程调用,凡是内核内存的正常分配,该分配方式最常用。如果空闲空间不足,该次分配将使得进程进入睡眠,等待空闲页出现。不能在中断上下文、自旋锁保护的临界区和中断屏蔽保护的临界区使用。

2、GFP_ATOMIC:

用于分配请求不是来自于进程上下文,而是来自于中断、任务队列处理、内核定时器等中断上下文的情况,此时不能进入休眠。如果空闲内存不足,立即返回。

  • 8
    点赞
  • 78
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值