kernel管理的设备千差万别,但最终都归于统一设备模型的管理, 即sysfs,理解了sysfs,就可以管窥蠡豹,对整个DeviceDriver子系统有一个清晰的认识。sysfs的实质是以文件系统的形式展示内核中的Device Driver信息,因此,理解sysfs可以分为2个维度的问题:
- sysfs的Inside Tree的组织思想
- sysfs的Outside Tree的目录结构
本文主要讨论内部树的基础,kobject,kset和ktype的定义,联系及其常用API
kobject
list_head是内核所有链式存储数据结构的基础,可以看作这些struct的父类,基于同样的思想,在Device Driver Subsystem中, 这个全局父类的角色由kobject担任,当然,kobject本身也是一个list_head的子类。kobject为Device Driver管理的对象提供了最高层次的抽象,无论是Device对象还是Driver对象,都可以看作kobject的父类,sysfs通过kobject,就可以管理系统中所有的Device对象和Driver对象。
//include/linux/kobject.h
63 struct kobject {
64 const char *name;
65 struct list_head entry;
66 struct kobject *parent;
67 struct kset *kset;
68 struct kobj_type *ktype;
69 struct kernfs_node *sd;
70 struct kref kref;
71 #ifdef CONFIG_DEBUG_KOBJECT_RELEASE
72 struct delayed_work release;
73 #endif
74 unsigned int state_initialized:1;
75 unsigned int state_in_sysfs:1;
76 unsigned int state_add_uevent_sent:1;
77 unsigned int state_remove_uevent_sent:1;
78 unsigned int uevent_suppress:1;
79 };
–64–>kobject对象的名字
–65–>kobject对象之间的连接件
–66–>该kobject对象的父kobject对象
–67–>该kobject所属的kset
–68–>该kobject附属的ktype
–69–>该kobject在sysfs中的形式,比如符号链接,目录以及属性等信息
–70–>引用计数成员,本质是一个原子变量,用于决定何时释放对象
–74–>1bit,如果该kobject对象已经被初始化,则为1
–75–>1bit,如果该kobject对象已经被添加到sysfs中,则为1
–76–>1bit,如果该kobject对象已经发送过uevent add事件到用户空间,则为1
–77–>1bit,如果该kobject对象已经发送过uevent remove事件到用户空间,则为1
–78–>1bit,如果该kobject对象”抑制”发送事件到用户空间,则为1
kobj_init()
Continue reading →