linux 裝置模型(一)

2022-07-31 16:30:23 字數 2223 閱讀 4410

隨著linux系統越來越成熟,與裝置驅動相關的一些新的特性需要加入,而之前獨立的裝置及其驅動程式能有效地溝通起來,linux2.6核心最初為了應付電源管理的需要,提出了乙個裝置模型來管理所有的裝置。在物理上,外設之間是有一種層次的關係,例如把乙個u盤插在電腦的usb介面,實際上這個u盤是掛在usb hub上,usb hub又是連線在usb2.0 host control上,usb2.0 host最終掛在pci bus匯流排上。這個裝置的物理層次關係如下:pci –>usb2.0 host control –>usb hub –>usb disk 。假設,電腦一段時間沒有任何操作,系統將進入休眠狀態,那麼系統首先需要逐層通知外設進入休眠模式,然後整個系統才可以休眠。所以,需要乙個樹狀的結構把所有的外設組織起來,這就是最初建立linux裝置模型的目的(應付電源管理的需要)。在分析linux裝置模型時,應抓住乙個關鍵的本質,linux裝置模型給系統帶來了什麼好處,為什麼要提出這個概念?

因此,linux裝置模型 首要的目的就是為裝置和驅動建立乙個樹狀的模型。這樣的結果帶來了更多的便利,使用者可以通過這棵樹遍歷所有的裝置,建立裝置與驅動的聯絡,根據裝置的不同可以從更高層次對裝置進行歸類,這樣就可以更清晰的去「看」這可大樹。另外,linux裝置模型把很多裝置共有的一些操作抽象出來,這樣帶來的好處減少重複著輪子的可能。在設計linux裝置模型後,同時得到了乙個非常方便的副產品---sysfc虛擬檔案系統。sys給使用者提供了乙個從使用者空間去訪問核心裝置的方法,這個檔案系統只存在ram中,系統啟動後才會生成。

sysfs 檔案系統的目錄架構

sysfs被載入在/sys的目錄下,它的子目錄包括:

block:         在系統中發現的每個塊裝置在該目錄下對應乙個子目錄。每個子目錄中有包含一些屬性檔案,它們描述了這個塊裝置的各方面的屬性

bus:           在核心中註冊的每條匯流排在該目錄下對應乙個子目錄,如pci, usb i2c paltform等。其中在每個匯流排目錄裡面又包含兩個子目錄

devices 和drivers:devices目錄包含了整個系統中發現屬於該匯流排型別的裝置

driver 目錄包含了註冊到該匯流排的所有驅動

class:        將裝置按照功能進行分類

devices:    包含系統所有的裝置

kernel:      核心中的配置引數

module:    系統中所有模組的資訊

firmware:  系統中的韌體、

fs:             描述系統中的檔案系統

power:     系統中電源選項

這裡有9個目錄,這裡並不說9個目錄代表了9中不同的裝置型別,實際上這9個目錄是給我們提供了如何去看裝置模型的不同視角。從不同的目錄出發都有可能找到同乙個裝置。linux的所有裝置都可以在這個目錄中找到,從其它目錄(從另外乙個視角)找到它是指向這裡的乙個鏈結。這裡是乙個大雜燴,雖然五臟俱全但我們卻無從下手。這裡還是以u盤為例,插上u盤之後,在devices目錄裡如何找到這支u盤呢?真得很難辦到!!!但是如果透過block目錄,我們很容易就可以找到這個u盤裝置,符號鏈結device正是指向devices目錄下的位置。

現在,總結一下/sys目錄下各個子目錄的作用。block目錄是從塊裝置的角度來組織裝置;bus目錄是從系統匯流排這個角度來組織裝置,比如pci匯流排或者usb匯流排;class目錄把看問題的視角提高到了類別的高度,比如pci裝置或者usb裝置等;dev目錄的視角是裝置節點;devices目錄在前面提到了,這裡是所有裝置的大本營;firmware目錄包含了一些比較低階的子系統,比如acpi、efi等;fs目錄裡看到的是系統支援的所有檔案系統;kernel目錄下包含的是一些核心的配置選項;modules目錄下包含的是所有核心模組的資訊,核心模組實際上和裝置之間是有對應關係的,通過這個目錄順藤摸瓜找到devices或者反過來都是可以做到的;power目錄存放的是系統電源管理的資料,使用者可以通過它來查詢目前的電源狀態,甚至可以直接「命令」系統進入休眠等省電模式。sysfs正是使用者和核心裝置模型之間的一座橋梁,通過這個橋梁我們可以從核心中讀取資訊,也可以向核心裡寫入資訊。

如果要寫程式來訪問sysfs,可以像讀寫普通檔案一樣來操作/sys目錄下的檔案,或者,也可以使用

libsysfs

。不過需要注意的是,linux核心社群並不推薦用libsysfs,因為這個api的更新不夠快,趕不上核心的變化。libsysfs已經逐漸背離最初建立它的目標,這個lib帶來的問題似乎比它解決的還要多。當然,如果只是要訪問裝置,一般很少會直接操作sysfs,它太細節太底層了,大部分情況下可以使用更加方便的

devicekit

或者libudev

Linux裝置模型

linux裝置驅動模型 我們在寫最簡單的裝置驅動程式的時候,我們將所有的硬體資訊都儲存在了驅動 中,這樣有乙個非常明顯的不足 會導致驅動程式的通用性極差,一旦硬體平台或硬體連線有鎖改變,就一定要修改驅動 為了解決這個問題,linux在2.6版本之後,新增了 匯流排 裝置 驅動 的linux裝置模型,...

linux裝置模型

linux核心的整體架構 linux裝置模型 linux裝置模型 1 基本概念 linux裝置模型 2 kobject linux裝置模型 3 uevent linux裝置模型 4 sysfs linux裝置模型 5 device和device driver linux裝置模型 6 bus linu...

Linux裝置模型《一》認識Sysfs

話說自從那晚聽宿舍那哥們聽這首 冬天的秘密 我便喜歡上了。今晚很火大被那個小夥子給噴了,好心幫他卻被找噴。這究竟是個什麼社會 sysfs is a ram based filesystem initially based on ramfs.it provides a meansto export k...