本文介紹Linux內核內存分配函數devm_kmalloc()
和devm_kzalloc()
。node
1、devm_kmalloc
文件:drivers/base/devres.c
,定義以下:linux
/** * 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()
添加到設備資源列表中。this
後續在設備資源管理(device resource management
)中詳細介紹。spa
2、devm_kzalloc
文件:include/linux/device.h
,定義以下:code
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()
。區別:內存分配成功後清零。內存
注:ci
1)devm_kmalloc()
和devm_kzalloc()
是具備資源管理的kmalloc()
和kzalloc()
。與所屬設備關聯,在probe
函數中使用。當設備驅動被卸載時,該內存被自動釋放,也可以使用devm_kfree()
函數直接釋放。資源
2)kmalloc()
和kzalloc()
申請的內存必須調用kfree()
釋放。it
3、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); }