1. 程式人生 > >宋寶華《Linux裝置驅動開發詳解》——sysfs檔案系統與linux裝置模型(5.4.2)

宋寶華《Linux裝置驅動開發詳解》——sysfs檔案系統與linux裝置模型(5.4.2)

以下讀書筆記內容,摘自宋寶華《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 所示。