**
隨著計算機的周邊外設越來越豐富,裝置管理已經成為現代作業系統的一項重要任務,這對於linux來說也是同樣的情況。每次linux核心新版本的發布,都會伴隨著一批裝置驅動進入核心。在linux核心裡,驅動程式的**量占有了相當大的比重。下圖是我在網路上搜尋到的一幅linux核心**量的統計圖,對應的核心版本是2.6.29。
我們可以很明顯的看到,在linux核心中驅動程式的比例已經非常高了。
linux 2.6核心最初為了應付電源管理的需要,提出了乙個裝置模型來管理所有的裝置。在物理上,外設之間是有一種層次關係的,比如把乙個u盤插到筆記本上,實際上這個u盤是接在乙個usb hub上,usb hub又是接在usb 2.0 host controller (ehci)上,最終ehci又是乙個掛在pci bus上的裝置。這裡的乙個層次關係是:pci->ehci->usb hub->usb disk。如果作業系統要進入休眠狀態,首先要逐層通知所有的外設進入休眠模式,然後整個系統才可以休眠。因此,需要有乙個樹狀的結構可以把所有的外設組織起來。這就是最初建立linux裝置模型的目的。
當然,linux裝置模型給我們帶來的便利遠不止如此。既然已經建立了乙個組織所有裝置和驅動的樹狀結構,使用者就可以通過這棵樹去遍歷所有的裝置,建立裝置和驅動程式之間的聯絡,根據型別不同也可以對裝置進行歸類,這樣就可以更清晰的去「看」這顆枝繁葉茂的大樹。另外,linux驅動模型把很多裝置共有的一些操作抽象出來,大大減少了重複造輪子的可能。同時linux裝置模型提供了一些輔助的機制,比如引用計數,讓開發者可以安全高效的開發驅動程式。達成了以上這些好處之後,我們還得到了乙個非常方便的副產品,這就是sysfs----乙個虛擬的檔案系統。sysfs給使用者提供了乙個從使用者空間去訪問核心裝置的方法,它在linux裡的路徑是/sys。這個目錄並不是儲存在硬碟上的真實的檔案系統,只有在系統啟動之後才會建起來。
下面這個命令可以用來顯示sysfs的大致結構:
tree /sys這個命令的資訊量非常大,我就不貼出來了,如果有興趣的話可以看看這裡,或者自己動手實驗一下。
我們來看看第一層目錄結構:
/sys這裡有10個子目錄,但並不是說這10個目錄代表了10種完全不同的裝置型別,實際上這些目錄只是給我們提供了如何去看整個裝置模型的不同的視角。其實從不同的目錄出發都有可能找到同乙個裝置的。那真正的裝置資訊到底放在**呢?看看目錄的名稱就應該能猜到,對,就是devices子目錄,linux的所有裝置都可以在這個目錄裡找到。這裡是乙個大雜燴,雖然五臟俱全但我們卻無從下手。這裡還是以u盤為例,插上u盤之後,在devices目錄裡如何找到這支u盤呢?真得很難辦到。但是如果知道這個u盤在系統裡的裝置檔名(暫且假設為sdb),那就可以從block目錄著手。|-- block
|-- bus
|-- class
|-- dev
|-- devices
|-- firmware
|-- fs
|-- kernel
|-- module
`-- power
透過block目錄,我們很容易就可以找到這個u盤裝置,符號鏈結device正是指向devices目錄下的位置。
到這裡,我們總結一下/sys目錄下各個子目錄的作用。block目錄是從塊裝置的角度來組織裝置;bus目錄是從系統匯流排這個角度來組織裝置,比如pci匯流排或者usb匯流排;class目錄把看問題的視角提高到了類別的高度,比如pci裝置或者usb裝置等;dev目錄的視角是裝置節點;devices目錄在前面提到了,這裡是所有裝置的大本營;firmware目錄包含了一些比較低階的子系統,比如acpi、efi等;fs目錄裡看到的是系統支援的所有檔案系統;kernel目錄下包含的是一些核心的配置選項;modules目錄下包含的是所有核心模組的資訊,核心模組實際上和裝置之間是有對應關係的,通過這個目錄順藤摸瓜找到devices或者反過來都是可以做到的;power目錄存放的是系統電源管理的資料,使用者可以通過它來查詢目前的電源狀態,甚至可以直接「命令」系統進入休眠等省電模式。
sysfs正是使用者和核心裝置模型之間的一座橋梁,通過這個橋梁我們可以從核心中讀取資訊,也可以向核心裡寫入資訊。
在linux裡也可以找到一些圖形化的工具來查詢裝置資訊。比如gnome下基於hal的device manager:
或者kde下基於solid的kinfocenter:
這些圖形化的工具提供了更加直觀的方式來訪問裝置,但是它們的提供的資訊還不夠全面,而且沒有向核心裝置寫資料的功能。
如果具體到某一型別的裝置,linux下還有一些專用的工具可以使用。比如面向pci裝置的pciutils,面向usb裝置的usbutils,以及面向scsi裝置的lsscsi等。對於linux開發者來說,有時使用這些專用的工具更加方便。
我們如果要寫程式來訪問sysfs,可以像讀寫普通檔案一樣來操作/sys目錄下的檔案,或者,也可以使用libsysfs。不過需要注意的是,linux核心社群並不推薦用libsysfs,因為這個api的更新不夠快,趕不上核心的變化。libsysfs已經逐漸背離最初建立它的目標,這個lib帶來的問題似乎比它解決的還要多。當然,如果只是要訪問裝置,一般很少會直接操作sysfs,它太細節太底層了,大部分情況下可以使用更加方便的devicekit或者libudev。
總結一下,本文主要簡單介紹了linux裝置模型的基本概念和虛擬檔案系統sysfs。接下來的篇章裡將和大家繼續**裝置模型在核心空間的一些細節。
Linux裝置模型(1)
隨著計算機的周邊外設越來越豐富,裝置管理已經成為現代作業系統的一項重要任務,這對於linux來說也是同樣的情況。每次linux核心新版本的發布,都會伴隨著一批裝置驅動進入核心。在linux核心裡,驅動程式的 量占有了相當大的比重。下圖是我在網路上搜尋到的一幅linux核心 量的統計圖,對應的核心版本...
Linux裝置模型 1
隨著計算機的周邊外設越來越豐富,裝置管理已經成為現代作業系統的一項重要任務,這對於linux來說也是同樣的情況。每次linux核心新版本的發布,都會伴隨著一批裝置驅動進入核心。在linux核心裡,驅動程式的 量占有了相當大的比重。下圖是我在網路上搜尋到的一幅linux核心 量的統計圖,對應的核心版本...
linux裝置模型 (1) led裝置
乙個簡單的led驅動裝置模型demo 以三星s5pc100的n類引腳的最低一位作為乙個led燈裝置 開發環境 宿主機fedora13,交叉編譯工具arm linux gcc4.3.2 處理器 s5pc100 先建乙個工程資料夾 home led device 下放led裝置有關檔案 s5pc100 ...