×
新网 > 虚机资讯 > 正文

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

  • 作者:zccc
  • 来源:网络
  • 2020-07-31 12:02:06

系统运维 关于linux设备驱动是否使用全局变量的问题 今天有人问我,关于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

新网虚拟主机

  • 相关专题

免责声明:本文内容由互联网用户自发贡献自行上传,本网站不拥有所有权,也不承认相关法律责任。如果您发现本社区中有涉嫌抄袭的内容,请发送邮件至:operations@xinnet.com进行举报,并提供相关证据,一经查实,本站将立刻删除涉嫌侵权内容。

免费咨询获取折扣

Loading