devres驱动笔记

本文详细介绍了Linux内核中设备资源管理的相关函数,包括devres_alloc和devres_add的使用。devres_alloc用于动态分配设备资源,而devres_add则将资源添加到设备的资源列表中。通过devres机制,内核能够有效地管理和释放设备的资源,确保系统资源的合理利用。

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

参考:

devres in linux driver - sammei - 博客园

1、devres_alloc函数:

源码路径:include/linux/device.h 

static inline void *devres_alloc(dr_release_t release, size_t size, gfp_t gfp)
{
        return devres_alloc_node(release, size, gfp, NUMA_NO_NODE);
}

devres_alloc_node函数源码路径:drivers/base/devres.c

void * devres_alloc_node(dr_release_t release, size_t size, gfp_t gfp, int nid)
{
	struct devres *dr;

	dr = alloc_dr(release, size, gfp | __GFP_ZERO, nid);

	return dr->data;
}
static __always_inline struct devres * alloc_dr(dr_release_t release,
						size_t size, gfp_t gfp, int nid)
{
	size_t tot_size = sizeof(struct devres) + size;
	struct devres *dr;

	memset(dr, 0, offsetof(struct devres, data)); //将data成员前面的内存都清零

	INIT_LIST_HEAD(&dr->node.entry);
	dr->node.release = release;
	return dr;
}

2、struct devres结构体定义:

struct devres {
	struct devres_node		node;

	u8 __aligned(ARCH_KMALLOC_MINALIGN) data[];
};

3、举例:

struct regmap *__devm_regmap_init(struct device *dev,...)
{
	struct regmap **ptr, *regmap;
    
    //data指向分配的资源*ptr,所以指针的指针是二维指针
	ptr = devres_alloc(devm_regmap_release, sizeof(*ptr), GFP_KERNEL);
    ......
}

4、devres_add函数:

 

void devres_add(struct device *dev, void *res)
{
	struct devres *dr = container_of(res, struct devres, data);
    ......
	add_dr(dev, &dr->node);
}
static void add_dr(struct device *dev, struct devres_node *node)
{
	list_add_tail(&node->entry, &dev->devres_head);
}

5、其它API函数:

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值