Linux裝置模型 (1)

來源:互聯網
上載者:User

隨著電腦的周邊外設越來越豐富,裝置管理已經成為現代作業系統的一項重要任務,這對於Linux來說也是同樣的情況。每次Linux核心新版本的發布,都會伴隨著一批裝置驅動進入核心。在Linux核心裡,驅動程式的代碼量佔有了相當大的比重。是我在網路上搜尋到的一幅Linux核心代碼量的統計圖,對應的核心版本是2.6.29。

我們可以很明顯的看到,在Linux核心中驅動程式的比例已經非常高了。

Linux 2.6核心最初為了應付電源管理的需要,提出了一個裝置模型來管理所有的裝置。在物理上,外設之間是有一種層次關係的,比如把一個隨身碟插到筆記本上,實際上這個隨身碟是接在一個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
|-- block
|-- bus
|-- class
|-- dev
|-- devices
|-- firmware
|-- fs
|-- kernel
|-- module
`-- power

這裡有10個子目錄,但並不是說這10個目錄代表了10種完全不同的裝置類型,實際上這些目錄只是給我們提供了如何去看整個裝置模型的不同的視角。其實從不同的目錄出發都有可能找到同一個裝置的。那真正的裝置資訊到底放在哪裡呢?看看目錄的名稱就應該能猜到,對,就是devices子目錄,Linux的所有裝置都可以在這個目錄裡找到。這裡是一個大雜燴,雖然五髒俱全但我們卻無從下手。這裡還是以隨身碟為例,插上隨身碟之後,在devices目錄裡如何找到這支隨身碟呢?真得很難辦到。但是如果知道這個隨身碟在系統裡的裝置檔案名稱(暫且假設為sdb),那就可以從block目錄著手。

透過block目錄,我們很容易就可以找到這個隨身碟裝置,符號連結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。接下來的篇章裡將和大家繼續探討裝置模型在核心空間的一些細節。

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.