天天看點

linux裝置模型之kobject、kset和kobj_type

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對象的熱插拔操作,提供一種與使用者空間熱插拔資訊進行通信的機制。

繼續閱讀