参考文章:http://www.wowotech.net/linux_kenrel/class.html
目录
1. 前言
在设备模型中,Bus、Device、Device driver等等,都比较好理解,因为它们对应了实实在在的东西,所有的逻辑都是围绕着这些实体展开的。而本文所要描述的Class就有些不同了,因为它是虚拟出来的,只是为了抽象设备的共性。
举个例子,一些年龄相仿、需要获取的知识相似的人,聚在一起学习,就构成了一个班级(Class)。这个班级可以有自己的名称(如295),但如果离开构成它的学生(device),它就没有任何存在意义。另外,班级存在的最大意义是什么呢?是由老师讲授的每一个课程!因为老师只需要讲一遍,一个班的学生都可以听到。不然的话(例如每个学生都在家学习),就要为每人请一个老师,讲授一遍。而讲的内容,大多是一样的,这就是极大的浪费。
设备模型中的Class所提供的功能也一样了,例如一些相似的device(学生),需要向用户空间提供相似的接口(课程),如果每个设备的驱动都实现一遍的话,就会导致内核有大量的冗余代码,这就是极大的浪费。所以,Class说了,我帮你们实现吧,你们会用就行了。
这就是设备模型中Class的功能,再结合内核的注释:A class is a higher-level view of a device that abstracts out low-level implementation details(include/linux/device.h line326),就容易理解了。
在Linux设备驱动程序(第三版,魏永明等译,简称LDD3)第十四章“类”一小节中有如下论述:
类是一个设备的高层视图,抽象出了底层的实现细节。类允许用户空间使用设备所提供的功能,而不关心设备是如何连接的,和它们是如何工作的。类子系统是向用户空间导出信息的最好方法。
2. Class 数据结构
按照老传统,描述功能前,先介绍一下Class的一些核心数据结构,对Class模块而言,核心数据结构就是struct class,另外,还有一个sub system相关的结构,会一并说明。
源码版本:Kernel 3.10
源码路径:
include/linux/device.h
drivers/base/base.h
2.1. struct class
// inlcude/linux/device.h, line 332
struct class {
const char *name;
struct module *owner;
struct class_attribute *class_attrs