天天看點

Linux裝置驅動模型架構分析(四)——LDDM的高層視圖classclassclass_attributeclass_interfaceclass、class_interface和kobject族的關系

類是一個裝置的高層視圖,抽象出了底層的實作細節。類允許使用者空間使用裝置所提供的功能,而不關心裝置是如何連接配接的,和它們是如何工作的。類子系統是向使用者空間導出資訊的最好方法。

類的核心資料結構是class,在分析device中介紹過,這個class不如bus,device,driver好了解,我了解它的主要功能是一是裝置管理,二是抽象出一類裝置的公共屬性。

前面分析subsys_private時說過,class和bus_type很類似,我們在裝置總線驅動模型中建立裝置時,要指定它所屬的bus,那麼在建立類裝置的時候也需要指定它所從屬的類,class也離不開kobject,是以如果你了解總線裝置驅動模型,你就會發現,其實真的都是差不多的東西。

裝置驅動一般在注冊的時候都會調用此類class的一些函數,主要作用就是在sys目錄裡面建立一些節點,比如cd到/sys/class下面可以看到這一類的裝置,如:

Linux裝置驅動模型架構分析(四)——LDDM的高層視圖classclassclass_attributeclass_interfaceclass、class_interface和kobject族的關系

前面提到過子系統的概念,一個class就是一個subsystem,具象的就是如上圖中的input,tty,rtc等。進入子系統,子系統下面會有裝置,如:

Linux裝置驅動模型架構分析(四)——LDDM的高層視圖classclassclass_attributeclass_interfaceclass、class_interface和kobject族的關系

就是一些指向devices目錄下的連結,這個有什麼用呢?一是如前面所說,提供給使用者空間導出資訊的方法,例如想找fb0,pci總線下是這樣的:

Linux裝置驅動模型架構分析(四)——LDDM的高層視圖classclassclass_attributeclass_interfaceclass、class_interface和kobject族的關系

不知所雲。

devices下是這樣的:

Linux裝置驅動模型架構分析(四)——LDDM的高層視圖classclassclass_attributeclass_interfaceclass、class_interface和kobject族的關系

還是不知所雲。顯然class是更友善查找的。

二是udev/mdev使用class可以自動管理裝置檔案,例如,自動生成/dev下裝置節點了,重命名裝置節點等。

對于一個新裝置,可以注冊進一個class也可以不注冊進去,如果存在對應class的話注冊進去更好。

class

Linux裝置驅動模型架構分析(四)——LDDM的高層視圖classclassclass_attributeclass_interfaceclass、class_interface和kobject族的關系

name,class的名稱,會在“/sys/class/”目錄下展現。

class_atrrs,該class的預設attribute,會在class注冊到核心時,自動在“/sys/class/xxx_class”下建立對應的attribute檔案。

dev_groups,該class下每個裝置的attribute,會在裝置注冊到核心時,自動在該裝置的sysfs目錄下建立對應的attribute檔案。

dev_kobj,表示該class下的裝置在/sys/dev/下的目錄,現在一般有char和block兩個,如果dev_kobj為NULL,則預設選擇char。

dev_uevent,當該class下有裝置發生變化時,會調用class的uevent回調函數。

class_release,用于release自身的回調函數。

dev_release,用于release class内裝置的回調函數。在device_release接口中,會依次檢查Device、Device Type以及Device所在的class,是否注冊release接口,如果有則調用相應的release接口release裝置指針。

p,見subsys_private。

class_attribute

Linux裝置驅動模型架構分析(四)——LDDM的高層視圖classclassclass_attributeclass_interfaceclass、class_interface和kobject族的關系

這個類沒有什麼可說的。見後邊對于sysfs的分析。

class_interface

當裝置添加或移除的時候,調用class_interface預先設定好的回調函數。

Linux裝置驅動模型架構分析(四)——LDDM的高層視圖classclassclass_attributeclass_interfaceclass、class_interface和kobject族的關系

node,連入subsys_private的interfaces的節點。

class,接口所屬class

add_dev,裝置添加到所屬class時調用的回調函數

remove_dev,裝置删除時調用的回調函數

将裝置從子系統加入或删除時,會周遊subsys_private的interfaces中的所有class_interface,并調用add_dev/remove_dev。

class、class_interface和kobject族的關系

Linux裝置驅動模型架構分析(四)——LDDM的高層視圖classclassclass_attributeclass_interfaceclass、class_interface和kobject族的關系

繼續閱讀