欢迎光临散文网 会员登陆 & 注册

一文讲解Linux 设备模型 kobject,kset

2023-02-10 15:21 作者:补给站Linux内核  | 我要投稿

设备驱动模型

面试的时候,有面试官会问,什么是Linux 设备驱动模型?你要怎么回答?

这个问题,突然这么一问,可能你会愣住不知道怎么回答,因为Linux 设备驱动模型是一个比较整体的概念,Linux 内核一半的代码都是设备驱动,怎么管理设备驱动,怎么抽象,怎么简化驱动开发的工作,这就是设备驱动模型要干的事情

其实你不懂也没关系,你反问下面试官,你是如何理解设备驱动模型的,虽然面试失败了,但是你学到东西了啊,岗位那么多,下一家可能就是你人生的巅峰呢。

Linux 设备驱动模型,说到这个部分,就不得不提几个重要的东西,BUS(总线),Class(类),Device(设备),Driver(驱动)。

 Bus(总线): Linux 把总线设计成一个道路,所有的设备都都必须挂载在总线上面,你可以理解为,所有的车子都必须开在高速路上,要不然就不遵守规则了。

Class(分类): 在Linux设备模型中,Class的概念非常类似面向对象程序设计中的Class(类),它主要是集合具有相似功能或属性的设备,这样就可以抽象出一套可以在多个设备之间共用的数据结构和接口函数。块设备,字符设备,网络设备这些可以理解为大类。

Device(设备): 抽象系统中所有的硬件设备,描述它的名字、属性、从属的Bus、从属的Class等信息,我们正常些驱动,还会写上这个设备的一些硬件资源,中断口,复位口,I2C地址等等。

Device Driver(驱动): Linux设备模型用Driver抽象硬件设备的驱动程序,它包含设备初始化、电源管理相关的接口实现。而Linux内核中的驱动开发,基本都围绕该抽象进行(实现所规定的接口函数),如果有3个一样的设备,可以使用同一个驱动。

图片

kobject 是什么?

kobject 就是一个结构体而已,别看只是一个结构体,这个结构体可以说是串联了设备驱动里面的所有东西,设备驱动模型都是靠这个来穿针引线的,嗯,我觉得用穿针引线这个词语非常好,非常妙。每个kobject对应/sys/目录下面的一个目录,name指定的就是这个目录的名字。

既然kobject是对应/sys/下面的一个目录,那么kset是什么呢?好吧,kset也就只是一个结构体而已,这个结构体里面引用了kobject,这个应该是C语言的巧妙之处,使用这样的方式实现继承的关系,我包含里的类型,使用起来就是kobject是我的基类,通过这个基类我再创造出一个新的类,这个类的名字就是kset,类那个是C++的说法,在C里面就是一个结构体了。仅此而已。

既然我们知道 kobject是一个目录,那么kset是kobject的高级体,那么kset也就是一个目录,这个目录的名字也就是kobject来指定的,而且kset 里面有一个链表,可以看出来,kset就是一个类别的kobject的集合,比如bus目录下面,就全部是bus相关的,i2c是一个Bus,platform也是一个bus,等等。

图片
图片
图片


【文章福利】小编推荐自己的Linux内核技术交流群:【749907784】整理了一些个人觉得比较好的学习书籍、视频资料共享在群文件里面,有需要的可以自行添加哦!!!(含视频教程、电子书、实战项目及代码)    


container_of宏

之前写过文章说明这个宏的作用,分析了实现的过程,实际上就是一个,如果我们知道一个结构体成员变量,可以通过这个结构体成员变量获取这个结构体的指针。

container_of宏解析

图片

实例分析

Makefile:

图片

设备驱动使用kobject

看下面这个图片,我们看到设备驱动使用kobject 的流程

图片

原文作者:嵌入式Linux




一文讲解Linux 设备模型 kobject,kset的评论 (共 条)

分享到微博请遵守国家法律