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



發佈了18 篇原創文章 · 獲贊 8 · 訪問量 4萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章