宋寶華《Linux裝置驅動開發詳解》——sysfs檔案系統與linux裝置模型(5.4.2)
阿新 • • 發佈:2019-01-23
以下讀書筆記內容,摘自宋寶華《Linux裝置驅動開發詳解》一書。
1、sysfs檔案系統的簡介
(1)linux2.6以後的核心引進syfs檔案系統,是虛擬檔案系統;
(2)產生一個包括所有系統硬體的層級檢視。
- 在/sys目錄下執行tree可以得到樹形目錄;
- 向用戶空間匯出核心資料結構和它們的屬性;
(3)而/proc檔案系統,提供程序和狀態資訊。
2、linux裝置模型
3、linux裝置模型元件:匯流排、裝置、驅動,類
(1)分別用bus_type、device_driver,device來描述匯流排、裝置和驅動;
- 在include/linux/device.h中定義
(2)結構體描述
- 裝置和驅動都必須依附於一種匯流排,因此都包含struct bus_type指標;
- 裝置和驅動是分開註冊的,通過bus_type的match()函式進行匹配;
- 一旦匹配成功,xxx_driver的probe()函式就被執行。
(3)裝置結構體
- device 結構體用於描述裝置相關的資訊裝置之間的層次關係,以及裝置與匯流排、驅動的關係。
- 核心提供了相應的函式用於操作 device 物件。其中 device_register()函式將一個新的 device 物件插入裝置模型,並自動在/sys/devices 下建立一個對應的目錄。device_unregister()完成相反的操作,登出裝置物件。get_device()和 put_device()分別增加與減少裝置物件的引用計數。
- 通常 device 結構體不單獨使用,而是包含在更大的結構體中,比如描述 PCI 裝置的 struct pci_dev,其中的 dev 域就是一個 device 物件。
(4)驅動結構體
- 與 device 結構體類似,device_driver 物件依靠內嵌的 kobject 物件實現引用計數管理和層次結構組織。
- 核心提供類似的函式用於操作 device_driver 物件。如 get_driver()增加引用計數,driver_register()用於向裝置模型插入新的 driver 物件,同時在 sysfs 檔案系統中建立對應的目錄。
- device_driver()結構體還包括幾個函式,用於處理探測、移除和電源管理事件。
(5)匯流排結構體
- 每個 bus_type 物件都對應/sys/bus 目錄下的一個子目錄,如 PCI 匯流排型別對應於/sys/bus/pci。
- 在每個這樣的目錄下都存在兩個子目錄:devices和 drivers(分別對應於 bus_type 結構中的 devices 和 drivers 域)。其中 devices 子目錄描述連線在該總線上的所有裝置,而 drivers 目錄則描述與該匯流排關聯的所有驅動程式。
- 與 device_driver 物件類似,bus_type 結構還包含幾個函式處理熱插拔、即插即拔和電源管理事件的函式。
(6)sysfs中的目錄來源於這三個結構體,而目錄中的檔案來源於attribute。
- 匯流排、驅動和裝置最終落實為sysfs中的一個目錄,因為他們都是kobject的派生類(kobject是所有匯流排、裝置和驅動的抽象總類,而一個kobject對應sysfs中的一個目錄);
- 三個結構體中的attribute則落實為sysfs中的一個檔案。attribute會隨著show()和store()兩個函式,分別讀寫該attribute對應的檔案。
(7)class結構體
- 每個 class 物件(表示一類)包括一個 class_device 連結串列,每個 class_device 物件表示一個邏輯裝置,並通過 struct class_device 中的 dev 成員(一個指向 struct device 的指標)關聯一個物理裝置。這樣,一個邏輯裝置總是對應於一個物理裝置,但是一個物理裝置卻可能對應於多個邏輯裝置,程式碼清單 5.16 給出了 class_device 的定義。此外,class 結構中還包括用於處理熱插拔、即插即拔和電源管理事件的函式,這與 bus_type 物件相似。
(8)屬性
- 在 bus、device、driver 和 class 層次上都分別定義了其屬性結構體,包括bus_attribute、driver_attribute、class_attribute、class_device_attribute;
- 這幾個結構體的定義在本質是完全相同的,如程式碼清單 5.18 所示。