千家信息网

关于linux设备驱动是否使用全局变量的问题

发表于:2025-12-01 作者:千家信息网编辑
千家信息网最后更新 2025年12月01日,关于linux设备驱动是否使用全局变量的问题今天有人问我,关于linux设备驱动是否使用全局变量的问题,为什么说尽量不使用全局变量?其实这个问题从两方面说:1)使用全局变量,那么破坏了函数的重入性,为
千家信息网最后更新 2025年12月01日关于linux设备驱动是否使用全局变量的问题

关于linux设备驱动是否使用全局变量的问题

今天有人问我,关于linux设备驱动是否使用全局变量的问题,为什么说尽量不使用全局变量?

其实这个问题从两方面说:
1)使用全局变量,那么破坏了函数的重入性,为了实现函数重入,又不得不使用锁来保护全局变量。这个效率变得低下了。
函数重入,主要是使用局部变量,即变量放在线程的栈中,各自使用自己的,就不会冲突。另外一种是使用锁来保护,保证数据的完整性。

2)使用全局变量,那么就违背了linux驱动的编写原则。即一个驱动程序应该支持驱动多个设备同时工作。例如马达,一个马达驱动程序可能同时操作多个马达,多个轴的方向转动,一个马达控制一个轴向,例如x轴,y轴,z轴。 如果驱动程序里使用全局变量来保存设备信息,那么没法做到同时支持保存多个设备信息了。如果使用链表方式,一个链表节点保存一个设备信息,虽然可行,但是每次内核操作你的驱动的api时传入的struct device(例如struct i2c_client,内含了struct device),你不得不遍历链表并比较对象指针才能找到操作的设备的信息。显然效率低。

所以其实正确的方法是:
在probe时,分配一个私有结构体作为保存此设备的状态信息。然后调用dev_set_drvdata系列函数,把你分配的结构体和probe时传入的struct device进行绑定。 struct device是总线驱动在探查到新设备插入时创建的。
后面系统调用你的驱动的api函数时,传入的struct device,你通过dev_get_drvdata系列函数取回你的为此设备分配的私有结构体(内含具体设备的状态信息,例如i2c地址等),从而知道是操作哪个具体设备。

具体请参考我的《linux设备驱动模型》视频,
https://edu.51cto.com/course/17159.html
还有我的《如何编写设备驱动》或《深入linux内核》视频
https://edu.51cto.com/course/17132.html
https://edu.51cto.com/course/17155.html

另外我的相关培训视频请看:
欢迎观看我发布的各个课程: https://edu.51cto.com/lecturer/8896847.html

我的新的更多优惠的打包课程链接如下:
https://edu.51cto.com/sd/0a9d4

设备 驱动 变量 全局 信息 函数 设备驱动 多个 马达 问题 同时 程序 结构 视频 驱动程序 分配 内核 效率 状态 课程 数据库的安全要保护哪些东西 数据库安全各自的含义是什么 生产安全数据库录入 数据库的安全性及管理 数据库安全策略包含哪些 海淀数据库安全审计系统 建立农村房屋安全信息数据库 易用的数据库客户端支持安全管理 连接数据库失败ssl安全错误 数据库的锁怎样保障安全 云南虚拟服务器管理软件云主机 学习软件服务器设置是什么意思 西安凌谷软件开发有限公司 数据库安全检查工具 数据库十万次查询 崇明区互联网教育科技诚信经营 数据库 实现消息队列 sr158服务器换硬盘视频 工行上海软件开发中心年终奖 福建项目软件开发公司 网络安全宣传周汇演方案 关于网络安全为主题的社论 网关服务器和路由器有关系吗 e5服务器cpu好用吗 2020网络安全大整顿多长时间 中药药物分子靶点数据库 网络安全初中黑板报 乐檬网络技术有限公司 苏州物流软件开发公司 数据库如何建立外键联系 朝阳区品牌软件开发价格信息 达川软件开发有限公司 linux服务器登录认证 网络安全监岗工作汇报 科技互联网观察达人 网络安全及对策论文 宝安网络安全服务哪个品牌好 扬州网络安全宣传周校园日 软件开发行业股票 短信服务器接口
0