linux kernel:devres模块架构分析

参考文档:

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

bash 复制代码
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

c 复制代码
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

相关推荐
Uncertainty!!4 小时前
Ubuntu 22.04 安装超好用中文输入法rime-ice(雾凇拼音)过程记录
linux·ubuntu·中文输入法
ShineWinsu5 小时前
对于Linux:网络基础的解析
linux·网络·面试·udp·笔试·ip·tcp
↘"LYong6 小时前
旧版 CentOS 安装 Docker 完整指南(附国内镜像加速)
linux·运维·docker
Zhang~Ling6 小时前
Vim 多模式详解:命令、插入、底行与插件配置
linux·编辑器·vim
想你依然心痛8 小时前
Linux用户空间与内核空间通信:netlink、ioctl、mmap 零拷贝与性能对比
linux·运维·服务器
做个文艺程序员9 小时前
Linux第12篇:性能监控与瓶颈分析——CPU/内存/IO/网络全维度
linux·运维·网络
HAPPY酷9 小时前
【ROS2】 Conda 环境搭建(命令行版)
linux·运维·python·ubuntu·机器人·conda
hai31524754311 小时前
九章空间几何对照直译法:通用芯片 / 定制专用芯片 编译适配规则
linux·汇编·bash
没头脑的男大11 小时前
CMake学习教学
linux·c++·学习
ton_tom11 小时前
设备驱动程序编程-Linux2.6.10-kdb安装-32位
linux·运维·服务器