浅析Linux驱动模型中的底层数据结构kobject和kset
1、kobject
Linux内核用kobject来表示一个内核对象。它和Sysfs文件系统联系密切,在内核中注册到系统中的每个kobject对象在sysfs文件系统中对对应着一个文件目录。kobject数据结构通常的用法是嵌入到其对他的数据结构中(即容器,比如cdev结构),用于实现内核对该类数据结构对象的管理。这些数据结构(容器)通过kobject连接起来,形成了一个树状结构。
它在源码中的定义为:
/*<include/linux/kobject.h>*/ struct kobject { const char *name;/*用来表示该内核对象的名称,注册到系统后,可在sysfs系统目录中看到内核对象的文件夹*/ struct list_head entry;/*用来将一系列的内核对象构成链表,方便管理*/ struct kobject *parent;/*指向该内核对象的上层节点,构建内核对象之间的层次化关系*/ struct kset *kset;/*用来表示内核对象所属的kset对象的指针,kset代表了一个subsystem,容纳了同类型的kobject*/ struct kobj_type *ktype;/*该对象表示一组与sysfs文件系统相关的操作函数和属性,它可以应用于该内核对象在sysfs中对应的文件夹*/ struct sysfs_dirent *sd;/*用来表示该内核对象在sysfs文件系统中对应的目录项的实例*/ struct kref kref;/*其核心数据是一个原子型变量,用来表示内核对象的引用计数*/ unsigned int state_initialized:1;/*表示该内核对象的初始化状态*/ unsigned int state_in_sysfs:1;/*用于表示该内核对象在sysfs文件中是否有建立入口点*/ unsigned int state_add_uevent_sent:1; unsigned int state_remove_uevent_sent:1; };
内核中定义了一些用于操作kobject对象的函数,需要注意的是,驱动程序一般不会与这些内核底层函数直接打交道。内核定义的函数如下:
<pre name="code" class="cpp">kobject_set_name(struct kobject *kobj, const char *name, ...) __attribute__((format(printf, 2, 3))); /*函数功能:用来设定kobject中的name成员*/ kobject_init(struct kobject *kobj, struct kobj_type *ktype); /*函数功能:用来初始化一个kobject结构对象*/ kobject_add(struct kobject *kobj,struct kobject *parent, const char *fmt, ...); /*函数功能:将一个kobject对象加入到系统中,该函数主要功能有两个:*/ /*一是:建立kobject对象间的层次关系。二是:在sysfs文件系统中建立一个目录*/ kobject_init_and_add(struct kobject *kobj, struct kobj_type *ktype, struct kobject *parent, const char *fmt, ...); /*函数功能:初始化一个kobject对象并加入到系统中*/ kobject_del(struct kobject *kobj); /*函数功能:在sysfs文件树中把kobject对象对应的目录删除,同时从kset链表中删除*/ kobject_create(void); /*函数功能:用于分配并初始化一个kobject对象*/ kobject_create_and_add(const char *name,struct kobject *parent); /*函数功能:分配并初始化一个kobject对象,然后加入到系统中*/
从内核定义的对应kobject的操作函数可以知道,将一个kobject对象加入系统,或从系统中删除,主要都是围绕sysfs文件系统展开的,对应的结果反映到/sys目录中就是一个新目录的被创建或者一个已存在的目录被删除。这种对sysfs文件树的操作的显示意义除了想用户空间展示不同的kobject对象之间的关系外,还在于用户空间的程序可以通过文件系统的接口配置内核空间kobject对象的某些属性。
2、kset
kset可以认为是一组kobject的集合,是kobject的容器。kset本身也是一个内核对象,所以需要内嵌一个kobject对象,其完整的定义如下:
/*<include/linux/kobject.h>*/ struct kset { struct list_head list;/*用来将其中的kobject对象构建成链表*/ spinlock_t list_lock;/*对kset上的list链表进行访问操作时的自旋锁*/ struct kobject kobj;/*代表当前kset内核对象的kobject变量*/ struct kset_uevent_ops *uevent_ops;/*当kset中的某些kobject对象发展状态变化需要通知用户空间是,调用其中的函数来完成*/ };
内核中定义了一些用于操作kset对象的函数, 内核定义的函数如下:
set_init(struct kset *kset);/*函数功能:初始化一个kset对象*/ kset_register(struct kset *kset);/*函数功能:初始化并向系统注册一个kset对象*/ kset_unregister(struct kset *kset);/*函数功能:将指定的kset对象从系统中注销*/ kset_create_and_add(const char *name,/*函数功能:动态产生一个kset对象,然后将其加入到sysfs文件系统中*/ struct kset_uevent_ops *u, struct kobject *parent_kobj);
郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。