kojbect
裝置模型的核心部分就是kobject,它由structobject表示。Kobject類似于java語言的對象object類,提供諸如引用計數、名稱和父指針等字段,可以建立對象的層次結構。
其結構如下:
struct kobject {
constchar *name;
structlist_head entry;
structkobject *parent;
structkset *kset;
structkobj_type *ktype;
structsysfs_dirent *sd;
structkref kref;
unsignedint state_initialized:1;
unsignedint state_in_sysfs:1;
unsignedint state_add_uevent_sent:1;
unsignedint state_remove_uevent_sent:1;
unsignedint uevent_suppress:1;
};
- name:該kobject的名字,會作為檔案名出現在對應的sysfs中
- entry:連結清單元素,用于将該kobject連結到它所屬的kset的連結清單中。
- parent:指向該對象的父對象
- kset:如果該對象屬于一個kset,則指向所屬的kset
- ktype:包含了類型資訊,包括該對象的操作函數指針以及銷毀該對象時的釋放函數
- sd:該對象對應的sysfs節點資料結構
- kref:引用計數
幾個比特域的含義是正如名字所示,分别表示kobject是否初始化了,是否在sysfs中,是否發送過KOBJ_ADD消息,是否發送過KOBJ_REMOVE消息,是否禁止發送uevent。
kobject的初始化一般來說需要經過如下幾個步驟:
1) 首先将整個kobject清空(使用memset函數);
2) 初始化kobject的parent和kset字段,調用kobject_set_name設定kobject的名字,這個名字是sysfs入口使用的名字;
3) 調用kobject_init函數初始化kobject,這裡需要提供一個kobj_type變量。kobject_init函數會增加kobject的引用計數。
以上的多步操作也可以有kobject_create()自動處理,它傳回一個新配置設定的kobject。多數情況下應該使用kobject_create及其相關的輔助函數。
ktype
kobject對象被關聯到一種特殊的類型,即ktype(kernel object type的縮寫)。ktype由kobj_type結構體表示,其定義如下:
struct kobj_type {
void (*release)(struct kobject*kobj);
const struct sysfs_ops*sysfs_ops;
struct attribute**default_attrs;
const structkobj_ns_type_operations *(*child_ns_type)(struct kobject *kobj);
const void*(*namespace)(struct kobject *kobj);
};
- ktype用來表示一類kobject的公共内容,主要包括了對該kobject進行操作相關的函數指針資訊。每個kobject都要有一個對應的kobj_type結構,在kobject_init或者kobject_init_and_add調用時給出。
- release:函數指針,該類kobject的銷毀函數。
- sysfs_ops:包含了如何實作kobject的屬性資訊的函數指針
- default_attrs:預設屬性連結清單,這些屬性會在這類kobject建立時自動被建立
kset
ket是kobject對象的集合體。把它看成一個容器,可将所有相關的kobject對象置于同一個位置。ktype描述相關類型kobject所共有的特性,而kset把kobject集中到一個集合中,具有相同ktype的kobject可以被分組到不同的kset。就是說在linux核心中,隻有少數一些的ktype,卻有多個kset。
kobject中的kset之中指向相應的kset集合。kset集合有kset結構體表示,定義如下:
structkset {
struct list_head list;
spinlock_t list_lock;
struct kobject kobj;
const struct kset_uevent_ops*uevent_ops;
};
- list:子kobject連結清單
- list_lock:保護連結清單的自旋鎖
- kobj:kset内嵌的kobject,kset的子kobject的parent會指向它。
- uevent_ops:該kset的uevent(user event)操作函數集,用于處理集合中kobject對象的熱插拔操作,提供一種與使用者空間熱插拔資訊進行通信的機制。