浅析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);



浅析Linux驱动模型中的底层数据结构kobject和kset,古老的榕树,5-wow.com

郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。