歡迎來到Linux教程網
Linux教程網
Linux教程網
Linux教程網
您现在的位置: Linux教程網 >> UnixLinux >  >> Linux基礎 >> 關於Linux

設備模型之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連入鏈表的結尾,最終形成一個鏈表。

kobjec-kset

kobjec-kset

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

kobjec-kset

kobjec-kset

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

kobjec-kset

kobjec-kset

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

kobjec-kset

kobjec-kset

Copyright © Linux教程網 All Rights Reserved