設備驅動基礎0:設備模型之kobject,kset及其關系


Linux2.6以后的設備驅動,都是在設備模型的基礎上構建的,因此,要編寫linux下的設備驅動程序,不論是usb設備,pci設備等,都需要了解設備模型。

設備模型的基礎結構體主要是kobject,kset這兩個結構體:

struct kobject {

   char      * k_name;

   char      name[KOBJ_NAME_LEN];

   struct kref    kref;

   struct list_head  entry;

   struct kobject    * parent;

   struct kset    * kset;

   struct kobj_type  * ktype;

   struct dentry     * dentry;

};

 

struct kset {

   struct subsystem  * subsys;

   struct kobj_type  * ktype;

   struct list_head  list;

   struct kobject    kobj;

   struct kset_hotplug_ops  * hotplug_ops;

};

 

還有一個subsys結構體,但subsys結構體跟kset差不多,就多了一個互斥訪問信號量,因此,就不需要列出了,另外還有一個結構體

struct kobj_type {

   void (*release)(struct kobject *);

   struct sysfs_ops  * sysfs_ops;

   struct attribute  ** default_attrs;

 };

用來表示kobject,kset的類型。 

一個kobject結構如下圖的kobject 類型部分,而一個kset結構如下圖的kset 類型部分,一個kobject加入一個kset,主要是kobject結構體中的相關字段記錄了對應的kset信息,①記錄了kobject所對應kset,其所指向的是kset所包含的kobject的地址,②記錄了kobject所對應的kset的kset指針,③記錄了kobject的類型,④記錄了kset所有的kobject的鏈子,這個鏈子是一個雙向鏈表,每當有一個kobject加入到當前的kset,就會調用list_add_tail()函數,把要加入kset的kobject連入鏈表的結尾,最終形成一個鏈表。

當有另外一個kobject要加入當前的kset,其中的①②③步跟第一個加入當前kset的kobject是一樣的,即把要加入的kobject的成員設置,使之指向當前的kset對應數據,而④需要把kobject添加到kset的list的尾部,下圖表示了kobject b加入到kset A的圖示:

當有一個kset,需要加入到當前的kset,其方法也跟一個kobject要加入到當前kset一樣,即把要加入的kset中所包含的kobject的成員設置,使這些成員指向對應的kset的對應數據。而當前kset要加入另一個kset,其方式也是跟一個kset加入到當前kset一樣,都是設備kset中的kobject,使kobject的成員指向要加入的kset的對應數據即可,下圖顯示了一個kset B加入到kset A中的圖示。

一個簡單的kset,kobject關系圖如下:


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM