Linux设备模型之一:Class.doc
《Linux设备模型之一:Class.doc》由会员分享,可在线阅读,更多相关《Linux设备模型之一:Class.doc(6页珍藏版)》请在三一文库上搜索。
1、Linux设备模型之一:Class1. 概述在设备模型中,Bus、Device、Device driver等等,都比较好理解,因为它们对应了实实在在的东西,所有的逻辑都是围绕着这些实体展开的。而本文所要描述的Class就有些不同了,因为它是虚拟出来的,只是为了抽象设备的共性。举个例子,一些年龄相仿、需要获取的知识相似的人,聚在一起学习,就构成了一个班级(Class)。这个班级可以有自己的名称(如295),但如果离开构成它的学生(device),它就没有任何存在意义。另外,班级存在的最大意义是什么呢?是由老师讲授的每一个课程!因为老师只需要讲一遍,一个班的学生都可以听到。不然的话(例如每个学生都
2、在家学习),就要为每人请一个老师,讲授一遍。而讲的内容,大多是一样的,这就是极大的浪费。设备模型中的Class所提供的功能也一样了,例如一些相似的device(学生),需要向用户空间提供相似的接口(课程),如果每个设备的驱动都实现一遍的话,就会导致内核有大量的冗余代码,这就是极大的浪费。所以,Class说了,我帮你们实现吧,你们会用就行了。这就是设备模型中Class的功能,再结合内核的注释:A class is a higher-level view of a device that abstracts out low-level implementation details(include/
3、linux/device.h line326),就容易理解了。2. 数据结构描述2.1 struct classstruct class是class的抽象,它的定义如下:1: /* include/linux/device.h, line 332 */2: struct class 3: const char *name;4: struct module *owner;5:6: struct class_attribute *class_attrs;7: struct device_attribute *dev_attrs;8: struct bin_attribute *dev_bin_at
4、trs;9: struct kobject *dev_kobj;10:11: int (*dev_uevent)(struct device *dev, struct kobj_uevent_env *env);12: char *(*devnode)(struct device *dev, umode_t *mode);13:14: void (*class_release)(struct class *class);15: void (*dev_release)(struct device *dev);16:17: int (*suspend)(struct device *dev, pm
5、_message_t state);18: int (*resume)(struct device *dev);19:20: const struct kobj_ns_type_operaTIons *ns_type;21: const void *(*namespace)(struct device *dev);22:23: const struct dev_pm_ops *pm;24:25: struct subsys_private *p;26: ;其实struct class和struct bus很类似,解释如下:name,class的名称,会在“/sys/class/”目录下体现。c
6、lass_atrrs,该class的默认attribute,会在class注册到内核时,自动在“/sys/class/xxx_class”下创建对应的attribute文件。dev_attrs,该class下每个设备的attribute,会在设备注册到内核时,自动在该设备的sysfs目录下创建对应的attribute文件。dev_bin_attrs,类似dev_attrs,只不过是二进制类型attribute。dev_kobj,表示该class下的设备在/sys/dev/下的目录,现在一般有char和block两个,如果dev_kobj为NULL,则默认选择char。dev_uevent,当该
7、class下有设备发生变化时,会调用class的uevent回调函数。class_release,用于release自身的回调函数。dev_release,用于release class内设备的回调函数。在device_release接口中,会依次检查Device、Device Type以及Device所在的class,是否注册release接口,如果有则调用相应的release接口release设备指针。p,和“Linux设备模型(6)_Bus”中struct bus结构一样,不再说明。2.2 struct class_interfacestruct class_interface是这样的一
8、个结构:它允许class driver在class下有设备添加或移除的时候,调用预先设置好的回调函数(add_dev和remove_dev)。那调用它们做什么呢?想做什么都行(例如修改设备的名称),由具体的class driver实现。该结构的定义如下:1: /* include/linux/device.h, line 434 */2: struct class_interface 3: struct list_head node;4: struct class *class;5:6: int (*add_dev) (struct device *, struct class_interfa
9、ce *);7: void (*remove_dev) (struct device *, struct class_interface *);8: ;3. 功能及内部逻辑解析3.1 class的功能看完上面的东西,蜗蜗依旧糊里糊涂的,class到底提供了什么功能?怎么使用呢?让我们先看一下现有Linux系统中有关class的状况(这里以input class为例):rootandroid:/ # ls /sys/class/input/ -llrwxrwxrwx root root 2014-04-23 03:39 event0 - ././devices/platform/i2c-gpio
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- Linux 设备 模型 之一 Class
链接地址:https://www.31doc.com/p-3255468.html