Linux设备模型(一):kobject

本文探讨了Linux设备模型的概念,介绍了Sysfs、kobject和kset的作用与关系。设备模型简化了驱动开发,Sysfs提供了设备信息的访问路径,kobject与kset构建了设备的层次结构。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1.引言

1.1文档目的
本文档记录设备模型相关,描述了sysfs、kobject和kset相关知识。
1.2背景
1.3参考资料
名称 类型 作者 备注
Linux设备驱动程序(LDD3) 书籍 第14章
Linux设备驱动开发详解:基于最新的Linux4.0内核 书籍 宋宝华 第5.4.2节
国嵌内核驱动深入班5-2-1(kobject) 视频 谢老师
国嵌内核驱动深入班5-2-2(Kset) 视频 谢老师
http://www.wowotech.net/device_model/kobject.html 博客 wowo
https://blog.youkuaiyun.com/qq_16777851/article/details/81368580 博客

2.设备模型

为了降低设备多样性带来的Linux驱动开发的复杂度,以及设备热拔插处理、电源管理等,Linux内核提出了设备模型(也称作Driver Model)的概念。设备模型将硬件设备归纳、分类,然后抽象出一套标准的数据结构和接口。驱动的开发,就简化为对内核所规定的数据结构的填充和实现。

3.sysfs

Sysfs从2.6内核引入,是设备模型的产物(笨叔叔视频里说的)。所以这里要先理解sysfs这个文件系统。
Sysfs文件系统是一种类似于proc的特殊文件系统,它存在于内存当中,当系统启动时由内核挂载于内存当中。用于将系统中的设备组织成层次结构,并向用户空间程序提供详细的数据结构信息,使其从用户空间可以访问到。
Sysfs被加载到/sys/目录下。它的子目录包括:
Block :块设备信息,每个块设备都有一个子目录,每个子目录又包含一些属性文件,描述了块设备各方面的属性,如:设备大小。
Bus:在内核中注册的每条总线,都有一个子目录。如:pci spi i2c。
每个总线子目录又包含两个子目录device和drivers。
devices目录包含了整个系统中发现的所有属于该总线类型的设备。
drivers目录包含了注册到该总线的所有驱动。
Class:将设备按功能进行分类。如/sys/class/net目录下包含了所有网络接口。
Devices:包含所有的设备。
Kernel: 内核中的配置参数。
Module:系统中所有模块的信息。
Firmware:系统中的固件。
Fs:描述系统中的文件系统。
Power:系统中的电源选项。
举例说明,LDD3下面的图,显示了与USB鼠标相关联的设备模型的一小部分(以简化的形式给出)。一个鼠标设备,有三种不同的划分方法,存在三个目录中bus、devices和class。实际都指向devices里的设备。bus和class都是软链接,链接的位置/sys/devceis/下的设备文件。PS:软链接相当于windows的快捷方式。
在这里插入图片描述
图3.1 设备模型简化图
在这里插入图片描述
为什么有了proc还要sysfs了?
在某些时候,proc确实有点过于混乱,需要一种新方法。相比于 proc 文件系统,使用 sysfs 导出内核数据的方式更为统一,并且组织的方式更好,它的设计从 proc 中吸取了很多教训。

4.kobject

Kobject实现了基本面向对象管理机制,是构成linux2.6设备模型的核心结构。它与sysfs文件系统紧密相连,在内核中注册的每一个kobject对象对应sysfs文件系统中的一个目录。类似于c++中的基类,kobject常被嵌入于其他类型(即:容器)中。如bus,devices,drivers都是典型的容器,这些内容通过kobject连接起来,形成了一个树状结构。一个kobject对自身并不感兴趣,它存在的意义在于把高级对象连接到设备模型上。
kobject 简单来说,是创建sys下面的目录的。对应sys下一个文件夹。attribute 对应kobject目录下一个文件。
kset就是具有相同类型的kobject的集合。kset可以包含目录,kobject本身是目录只能包含文件,不能包含目录。
在linux源码的samples/kobject/下有kobject和kset的例子,还有国嵌的例子,写的比较好便于理解。
Kobject和kset操作中有很多类似的接口。具体看例子就知道了。

5.attribute

sysfs中的目录描述了kobject,而kobject是特定数据类型变量(如struct device)的体现。因此kobject的属性,就是这些变量的属性。它可以是任何东西,名称、一个内部变量、一个字符串等等。而attribute,在sysfs文件系统中是以文件的形式提供的,即:kobject的所有属性,都在它对应的sysfs目录下以文件的形式呈现。这些文件一般是可读、写的,而kernel中定义了这些属性的模块,会根据用户空间的读写操作,记录和返回这些attribute的值。
总结一下:所谓的attibute,就是内核空间和用户空间进行信息交互的一种方法,不一定要用ioctl、read和write的方式。例如某个driver定义了一个变量,却希望用户空间程序可以修改该变量,以控制driver的运行行为,那么就可以将该变量以sysfs attribute的形式开放出来。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值