linux kernel:devres模块架构分析

本文详细介绍了Linux内核中的Devres(设备资源管理)机制,包括devres_alloc()函数的用法、资源的动态分配与释放、devres_api的应用以及在driver_model中的具体实现。重点讨论了devm_pinctrl_register()示例和资源数据结构的变化过程。
摘要由CSDN通过智能技术生成

参考文档:

https://www.kernel.org/doc/html/latest/driver-api/driver-model/devres.html
https://www.cnblogs.com/sammei/p/3498052.html devres in linux driver

devres:  Managed Device Resource
device resource management

devres_alloc()动态申请内存分配一个devres结构体管理resource资源。
1,指定需要的resource资源的内存大小
(由于不同的device所需的资源多少不一样,所以,需要device告知devres所需的内存多少)
2,指定释放resource资源的release()函数
(由于不同的device所需的资源不一样,所以,需要device告知release()函数,用于释放分配的资源)
3,devres功能是:device告知resource和release(),devres在适当的时机回调release()释放resource

devres功能:

在这里插入图片描述

devres api和初始数据结构:

相关文件:
include/linux/device.h
drivers/base/devres.c

在这里插入图片描述

初始数据结构图:
在这里插入图片描述

struct device里面的devres_head 链表头,用于管理devres
在这里插入图片描述

devm_pinctrl_register()举例devres使用案例

相关文件:drivers/pinctrl/core.c
该文件中只使用了如下devres api:
devres_alloc()
devres_free()
devres_add()
devres_release()

在这里插入图片描述

在kernel代码中,搜索了devres_alloc()函数。
有的是使用一级指针方式:如 struct dma_devres *dr
在这里插入图片描述
大部分使用的都是二级指针方式:如 struct pinctrl_dev **ptr
在这里插入图片描述

devres_alloc(devm_pinctrl_dev_release, sizeof(*ptr), GFP_KERNEL);
指定的resource资源内存大小是一个指针大小
指定的release释放资源的回调函数是:devm_pinctrl_dev_release

devres_alloc() -> devres_alloc_node() -> alloc_dr()

申请 "sizeof(struct devres) + size" 大小的内存, size 是指resource的大小. 

devres_alloc(…) 执行后数据结构图变化:
在这里插入图片描述

pinctrl_register(…)和devres_add(…)执行后数据结构图变化:
在这里插入图片描述

附 devres api 说明:
如下截图参考来自于:
https://www.cnblogs.com/sammei/p/3498052.html devres in linux driver
在这里插入图片描述

  • 9
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值