隨著設備拓撲結構越來越復雜,需要為內核建立一個統一的設備模型,對系統結構做一般性的抽象描述。
有了該抽象結構,可支持多種不同的任務:
a) 電源管理 完成電源管理工作需要對系統結構的理解,且有嚴格的順序,如:一個USB宿主適配器,在處理完所有與其相連接的設備面前是不能關閉的;
b) 與用戶空間通信 由/sysfs虛擬文件系統展示設備的屬性
c) 熱插拔設備
d) 對象生命周期
2.sysfs 虛擬文件系統
sysfs 是一個特殊的文件系統,類似於/proc。sysfs不僅象/proc一樣允許用戶空間訪問內核的數據,而且它以更結構化的方式向用戶提供內核數據信息。
sysfs的一個目的就是展示設備驅動模型中各組件的層次關系。其頂級目錄包括:
bordercolorlight = "black" bordercolordark = "#FFFFFF" align="center"> a) block b) device c) bus d) drivers e) class f) power g) firmware
每個目錄代表一個kobject對象,每個文件代表kobject的屬性。
3. Kobject、Kset 和 subsystem
3.1 Kobject
Kobject 是組成設備模型的基本結構。類似於C++中的基類,它嵌入於更大的對象的對象中--所謂的容器--用來描述設備模型的組件。如bus, devices, drivers 都是典型的容器。
容器有了kobject之後,允許內核:
a) 保存對容器的引用計數
b) 保存容器之間的層次關系
c) 為每個容器的屬性提供一個用戶視圖
bordercolorlight = "black" bordercolordark = "#FFFFFF" align="center"> struct kobject{ char * k_name; char name[20]; struct k_ref kref; struct list_head entry; struct kobject * parent; struct kset * kset; struct ktype * ktype; struct dentry * dentry; }; struct kobj_type{ void (*release) (struct kobject *); struct sysfs_ops *sysfs_ops; struct attribute **default_attrs; };
3.2 Kset
一個kset是嵌入相同類型結構的kobject集合。
bordercolorlight = "black" bordercolordark = "#FFFFFF" align="center"> struct kset{ struct subsystem * subsys; struct kobj_type ktype; struct list_head list; struct kobject kobj; struct kset_hotplug_ops * hotplug_ops; };
3.3 Subsystem
一系列的kset就組成了subsystem. subsystem可以包括不同類型的kset, 它只有兩個成員
bordercolorlight = "black" bordercolordark = "#FFFFFF" align="center"> struct subsystem{ struct kset kset; struct rw_semaphore rwsem; };
4.設備驅動模型的組件
4.1 device
4.2 drive
4.3 bus
4.4 class