linux内核函数kmalloc,Linux内核内存分配函数之devm_kmalloc和devm_kzalloc
本文介绍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相关推荐
- 替换libc中的内存分配函数
2019独角兽企业重金招聘Python工程师标准>>> 摘要: 本文介绍如何替换glibc中的内存分配函数为自定义的内存分配函数的方法,可以方便调试内存分配,和查找内存管理错误而产生 ...
- linux内核函数kmalloc,Linux_Linux平台上几个常见内核内存分配函数,* kmallocPrototype:#incl - phpStudy...
Linux平台上几个常见内核内存分配函数 * kmalloc Prototype: #include void *kmalloc(size_t size, int flags); Kmalloc分配一 ...
- Linux内核中常见内存分配函数
1. 原理说明 Linux内核中采用了一种同时适用于32位和64位系统的内存分页模型,对于32位系统来说,两级页表足够用了,而在x86_64系统中,用到了四级页表,如图2-1所示.四级页表分 ...
- Linux内核中内存分配函数
1.原理说明 Linux内核 中采 用了一种同时适用于32位和64位系统的内 存分页模型,对于32位系统来说,两级页表足够用了,而在x86_64系 统中,用到了四级页表,如图2-1所示.四级页表分别为 ...
- 内存分配函数 ExAllocatePool ExAllocatePoolWithTag
如同C里面的malloc一样,内核模式下的ExAllocatePool也是非常重要的.但是一说到ExAllocatePool函数就不得不提ExAllocatePoolWithTag函数.对比一下两个函 ...
- C语言动态内存管理和动态内存分配函数
给变量分配内存空间可分为静态内存分配和动态内存分配. 静态内存分配属于编译时给变量分配的空间,动态分配属于在程序运行时给变量分配的空间 静态分配属于栈分配,动态分配属于堆分配 运行效率上,静态内存比动 ...
- 【C/C++】内存分配函数:malloc,calloc,realloc,_alloca
[C/C++]内存分配函数:malloc,calloc,realloc,_alloca malloc: 原型:extern void *malloc(unsigned int num_bytes); ...
- 内存分配函数 malloc、realloc、calloc
C 语言主要提供 malloc.realloc.calloc.alloca 与 aligned_alloc 等内存分配函数来实现对内存的分配功能. 1) malloc 函数原型如下: void * m ...
- c语言字符指针分配内存,内存分配函数及使用注意事项,C语言内存分配函数完全攻略...
C 语言主要提供 malloc.realloc.calloc.alloca 与 aligned_alloc 等内存分配函数来实现对内存的分配功能. 1)malloc 函数原型如下: void * ma ...
最新文章
- 暑期集训5:并查集 线段树 练习题G: HDU - 1754
- P4198 楼房重建
- amd处理器更新zen4服务器芯片,AMD更新CPU、GPU路线图:Zen4架构与硬件光追可期
- 窄带语谱图c语言算法,MELP语音编码算法实现及算法改进
- sqlalchemy基本类型
- zblog主题OL免费清爽资讯博客主题
- 计算机中函数counta是什么意思,excel中counta函数和count函数的区别是什么?
- 写写做数模竞赛的经验
- STM32官方USB库下载指南
- 谷歌浏览器获取网页元素的xpath
- 计算机无法备份,iTunes无法备份是怎么回事?iTunes无法备份怎么解决?
- iis ftp服务器修改端口号,iis ftp服务器指定端口
- Java中未加入修饰符_(整理)java修饰符
- ProjectEuler Problem1.Multiples of 3 and 5
- “燕云十六将”之Jason郝钰(12)
- Python LAC使用
- 孢子气囊 tkinter控制台
- android easyPR车牌识别
- 沟通是一种伟大的生产力
- JVA核心类库随堂笔记
热门文章
- ceisum禁止鼠标左键和右键拖动,滚轮缩放事件
- Bresenham直线算法
- java slf4j log4j_SLF4J和log4j的使用
- html锚点的使用,html 锚点的使用
- 诗歌(5)—满庭芳(蜗角虚名)
- python3ide手机版_Pydroid3下载-Pydroid3 IDE集成开发环境APP 4.01_arm64 安卓版-我游网
- fliter(过滤器)
- 毫无头绪的自学Python,你可能连门槛都摸不到
- 内向者优势 原版_如果你是一个优柔寡断、性格内向的女生,建议从事这4种工作...
- Spring WebFlux 的异步非阻塞处理