linux内核函数kmalloc,Linux内核内存分配函数之devm_kmalloc和devm_kzalloc

本文介绍了Linux内核中的devm_kmalloc()和devm_kzalloc()函数,这两种函数用于设备资源管理下的内存分配,可在设备驱动程序卸载时自动释放内存。devm_kmalloc()通过alloc_dr()申请内存并由devres_add()添加到设备资源列表。

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

本文介绍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);

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值