本文介绍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);
}
网友评论