[kernel]kobject & kset
1.什麽是kobject
kobject是內核中的通用對象模型,用來為內核中各部分的對象管理提供統一視圖
kobject一般都不會單獨使用,這樣是沒有意義的,它總是內嵌到其他結構體中
由於kobject是系統統一管理的,因此先找到kobject對象進而跟蹤到其代表的具體對象是很常見的做法。當kobject內嵌在其他的結構體內時,可以通過container_of()這個宏來知道找到對應的結構體
2.創建kobject
使用kobject_create_and_add來創建kobject,這個接口完成kobject_create跟kobject_add的工作
struct kobject *kobject_create(void)
struct kobject {
const char name; / kobject對象的名字,對應sysfs中的目錄名 /
struct list_head entry; / 在kset中的鏈表節點 /
struct kobject parent; /* 用於構建sysfs中kobjects的層次結構,指向父目錄 /
struct kset kset; /* 所屬kset /
struct kobj_type ktype; /* 特定對象類型相關,用於跟蹤object及其屬性 /
struct sysfs_dirent sd; /* 指向該目錄的dentry私有數據 /
struct kref kref; / kobject的引用計數,初始值為1 /
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;
unsigned int uevent_suppress:1; / 是否忽略uevent事件 */
};
int kobject_add(struct kobject kobj, struct kobject parent,const char *fmt, ...)
這個函數負責將kobject 添加到系統當中,parent為NULL的時候會添加到sys目錄下
3.kobject的屬性
創建kobject相當於在/sys目錄下建立了一個目錄,我們可以透過一些接口為這些目錄設定一些屬性文件,上層可以透過對這些屬性文件的操作來與內核溝通,完成一些系統層面的工作
例如,上層可以透過/sys/power/下的某個屬性文件通知系統待機執行一些特定的流程等
屬性文件的創建方法:
通過sysfs_create_file設定kobject下的一個屬性
通過sysfs_create_group設定kobject下的一組屬性
4.kobject與kset的關系
[kernel]kobject & kset