linux裝置驅動模型裡兩個重要的資料結構:class和class_device
/************************基於linux-2.6.24.7版本核心********************************/
1、class
一個類是一個裝置的高層檢視,它抽象掉了底層的實現細節。例如,在驅動層面時,你可能會見到SCSI磁碟或者ATA磁碟;但在類層面時,它們都是磁碟。類允許使用者空間基於它們做什麼來使用裝置,而不是它們如何被連線或者它們如何工作。
class表示一類裝置,所有class都屬於class_subsys(class子系統),即出現在/sys/class目錄下,除了塊裝置(可能出現在/sys/block/或/sys/class/block)。
struct class { |
建立一個class有兩種方法
a、根據需要,填充一個struct class,然後再呼叫class_register註冊該class就ok了(此法比較靈活,可以自己定製很多東西)
b、就是通過下面的class_create來建立一個class,該函式會返回一個指向剛建立的class的指標(建立class的最簡單方法)
|
一個class屬性對應於/sys/class/class.name(class.name就是該class的名稱)目錄裡的一個檔案。通過這些檔案,可以向用戶空間輸出一些關於該class的資訊,也可從使用者空間獲取到一些資訊。
|
2、class_device
一個class可以看成是一個容器(一個子系統subsystem),包含了很多的class_device,這些class_device是由class這個大的容器來管理的,而每個class_device都對應著一個具體的裝置。
每個class物件包括一個class_device連結串列,每個class_device物件表示一個邏輯裝置並通過struct class_device中的dev成員(一個指向struct device的指標)關聯一個物理裝置。一個邏輯裝置總是對應一個物理裝置,而一個物理裝置卻可以對應多個邏輯裝置。
實際上,class_device在/sys/class/subsystem生成的目錄就是上面提到的class_device。這樣第2點也有了。
|
與class一樣,建立一個class_device也有兩種方法
a、根據需要,填充一個struct class_device,然後再呼叫class_device_register註冊該class_device就ok了(此法比較靈活,可以自己定製很多東西)
b、就是通過下面的class_device_create來建立一個class_device,該函式會返回一個指向剛建立的class_device的指標(建立class_device的最簡單方法)
|
class_device屬性對應於/sys/class/class.name/class_device.class_id目錄下一個檔案。通過這些檔案,可以向用戶空間輸出一些關於該class_device的資訊,也可從使用者空間獲取到一些資訊。
|
其實,在呼叫class_device_register註冊一個class_device時,該函式內部呼叫了
int class_device_add(struct class_device *class_dev)
在class_device_add內,通過class_device_create_file建立dev、uevent和該class_device所擁有的預設屬性(由class_device.class->class_dev_attrs指定)等屬性檔案。這樣第3點也有了。
dev屬性檔案用於向用戶空間輸出該class_device的裝置編號。
uevent屬性檔案使使用者可以手動觸發uevent事件(通過向該檔案寫,如add、remove等字串)。