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