本文介绍Linux内核内存分配函数devm_kmalloc()和devm_kzalloc()。

一、devm_kmalloc

文件:drivers/base/devres.c,定义如下:

/**

* devm_kmalloc - Resource-managed kmalloc

* @dev: Device to allocate memory for

* @size: Allocation size

* @gfp: Allocation gfp flags

*

* Managed kmalloc. Memory allocated with this function is

* automatically freed on driver detach. Like all other devres

* resources, guaranteed alignment is unsigned long long.

*

* RETURNS:

* Pointer to allocated memory on success, NULL on failure.

*/

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

{

struct devres *dr;

/* use raw alloc_dr for kmalloc caller tracing */

dr = alloc_dr(devm_kmalloc_release, size, gfp, dev_to_node(dev));

...

set_node_dbginfo(&dr->node, "devm_kzalloc_release", size);

devres_add(dev, dr->data);

return dr->data;

}

devm_kmalloc()函数通过alloc_dr() 申请设备资源,alloc_dr()调用流程如下:

alloc_dr()-> ## devres.c

kmalloc_node_track_caller()-> ## slab.h

kmalloc_track_caller()-> ## slab.h

__kmalloc_track_caller()-> ## salb.c

__do_kmalloc() ## 类似kmalloc实现

然后通过devres_add()添加到设备资源列表中。

后续在设备资源管理(device resource management)中详细介绍。

二、devm_kzalloc

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

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

{

return devm_kmalloc(dev, size, gfp | __GFP_ZERO);

}

devm_kzalloc()函数使用的参数和返回值同devm_kmalloc()。区别:内存分配成功后清零。

注:

1)devm_kmalloc()和devm_kzalloc()是具有资源管理的kmalloc()和kzalloc()。与所属设备关联,在probe函数中使用。当设备驱动被卸载时,该内存被自动释放,也可使用devm_kfree()函数直接释放。

2)kmalloc()和kzalloc()申请的内存必须调用kfree()释放。

三、devm_kfree

文件:drivers/base/devres.c,定义如下:

/**

* devm_kfree - Resource-managed kfree

* @dev: Device this memory belongs to

* @p: Memory to free

*

* Free memory allocated with devm_kmalloc().

*/

void devm_kfree(struct device *dev, void *p)

{

int rc;

rc = devres_destroy(dev, devm_kmalloc_release, devm_kmalloc_match, p);

WARN_ON(rc);

}

linux内核函数kmalloc,Linux内核内存分配函数之devm_kmalloc和devm_kzalloc相关推荐

  1. 替换libc中的内存分配函数

    2019独角兽企业重金招聘Python工程师标准>>> 摘要: 本文介绍如何替换glibc中的内存分配函数为自定义的内存分配函数的方法,可以方便调试内存分配,和查找内存管理错误而产生 ...

  2. linux内核函数kmalloc,Linux_Linux平台上几个常见内核内存分配函数,* kmallocPrototype:#incl - phpStudy...

    Linux平台上几个常见内核内存分配函数 * kmalloc Prototype: #include void *kmalloc(size_t size, int flags); Kmalloc分配一 ...

  3. Linux内核中常见内存分配函数

    1.      原理说明 Linux内核中采用了一种同时适用于32位和64位系统的内存分页模型,对于32位系统来说,两级页表足够用了,而在x86_64系统中,用到了四级页表,如图2-1所示.四级页表分 ...

  4. Linux内核中内存分配函数

    1.原理说明 Linux内核 中采 用了一种同时适用于32位和64位系统的内 存分页模型,对于32位系统来说,两级页表足够用了,而在x86_64系 统中,用到了四级页表,如图2-1所示.四级页表分别为 ...

  5. 内存分配函数 ExAllocatePool ExAllocatePoolWithTag

    如同C里面的malloc一样,内核模式下的ExAllocatePool也是非常重要的.但是一说到ExAllocatePool函数就不得不提ExAllocatePoolWithTag函数.对比一下两个函 ...

  6. C语言动态内存管理和动态内存分配函数

    给变量分配内存空间可分为静态内存分配和动态内存分配. 静态内存分配属于编译时给变量分配的空间,动态分配属于在程序运行时给变量分配的空间 静态分配属于栈分配,动态分配属于堆分配 运行效率上,静态内存比动 ...

  7. 【C/C++】内存分配函数:malloc,calloc,realloc,_alloca

    [C/C++]内存分配函数:malloc,calloc,realloc,_alloca malloc: 原型:extern void *malloc(unsigned int num_bytes); ...

  8. 内存分配函数 malloc、realloc、calloc

    C 语言主要提供 malloc.realloc.calloc.alloca 与 aligned_alloc 等内存分配函数来实现对内存的分配功能. 1) malloc 函数原型如下: void * m ...

  9. c语言字符指针分配内存,内存分配函数及使用注意事项,C语言内存分配函数完全攻略...

    C 语言主要提供 malloc.realloc.calloc.alloca 与 aligned_alloc 等内存分配函数来实现对内存的分配功能. 1)malloc 函数原型如下: void * ma ...

最新文章

  1. 暑期集训5:并查集 线段树 练习题G: HDU - 1754
  2. P4198 楼房重建
  3. amd处理器更新zen4服务器芯片,AMD更新CPU、GPU路线图:Zen4架构与硬件光追可期
  4. 窄带语谱图c语言算法,MELP语音编码算法实现及算法改进
  5. sqlalchemy基本类型
  6. zblog主题OL免费清爽资讯博客主题
  7. 计算机中函数counta是什么意思,excel中counta函数和count函数的区别是什么?
  8. 写写做数模竞赛的经验
  9. STM32官方USB库下载指南
  10. 谷歌浏览器获取网页元素的xpath
  11. 计算机无法备份,iTunes无法备份是怎么回事?iTunes无法备份怎么解决?
  12. iis ftp服务器修改端口号,iis ftp服务器指定端口
  13. Java中未加入修饰符_(整理)java修饰符
  14. ProjectEuler Problem1.Multiples of 3 and 5
  15. “燕云十六将”之Jason郝钰(12)
  16. Python LAC使用
  17. 孢子气囊 tkinter控制台
  18. android easyPR车牌识别
  19. 沟通是一种伟大的生产力
  20. JVA核心类库随堂笔记

热门文章

  1. ceisum禁止鼠标左键和右键拖动,滚轮缩放事件
  2. Bresenham直线算法
  3. java slf4j log4j_SLF4J和log4j的使用
  4. html锚点的使用,html 锚点的使用
  5. 诗歌(5)—满庭芳(蜗角虚名)
  6. python3ide手机版_Pydroid3下载-Pydroid3 IDE集成开发环境APP 4.01_arm64 安卓版-我游网
  7. fliter(过滤器)
  8. 毫无头绪的自学Python,你可能连门槛都摸不到
  9. 内向者优势 原版_如果你是一个优柔寡断、性格内向的女生,建议从事这4种工作...
  10. Spring WebFlux 的异步非阻塞处理