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關系圖如下: