1. 程式人生 > >Linux 裝置模型基本概念 (一)

Linux 裝置模型基本概念 (一)

1、裝置模型引入

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裝置模型的目的。

2、sysfs的引入

當然,Linux裝置模型給我們帶來的便利遠不止如此。既然已經建立了一個組織所有裝置和驅動的樹狀結構,使用者就可以通過這棵樹去遍歷所有的裝置,建立裝置和驅動程式之間的聯絡,根據型別不同也可以對裝置進行歸類,這樣就可以更清晰的去“看”這顆枝繁葉茂的大樹。另外,Linux驅動模型把很多裝置共有的一些操作抽象出來,大大減少了重複造輪子的可能。同時Linux裝置模型提供了一些輔助的機制,比如引用計數,讓開發者可以安全高效的開發驅動程式。達成了以上這些好處之後,我們還得到了一個非常方便的副產品,這就是sysfs----一個虛擬的檔案系統。sysfs給使用者提供了一個從使用者空間去訪問核心裝置的方法,它在Linux裡的路徑是/sys。這個目錄並不是儲存在硬碟上的真實的檔案系統,只有在系統啟動之後才會建起來。


tree /sys 就可以看到/sys 的結構了~

/proc是記憶體中有關係統程序的實時資訊;
/sys是有關係統核心以及驅動的實時資訊;


這裡有10個子目錄,但並不是說這10個目錄代表了10種完全不同的裝置型別,實際上這些目錄只是給我們提供瞭如何去看整個裝置模型的不同的視角。其實從不同的目錄出發都有可能找到同一個裝置的。那真正的裝置資訊到底放在哪裡呢?看看目錄的名稱就應該能猜到,對,就是devices子目錄,Linux的所有裝置都可以在這個目錄裡找到。

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

DeviceKit或者libudev

3、sys 結構

/sys下的子目錄

內容

/sys/devices

該目錄下是全域性裝置結構體系,包含所有被發現的註冊在各種總線上的各種物理裝置。一般來說,所有的物理裝置都按其在總線上的拓撲結構來顯示,但有兩個例外,即platform devicessystem devicesplatform devices一般是掛在晶片內部的高速或者低速總線上的各種控制器和外設,它們能被CPU直接定址;system devices不是外設,而是晶片內部的核心結構,比如CPUtimer等,它們一般沒有相關的驅動,但是會有一些體系結構相關的程式碼來配置它們。

(sys/devices是核心對系統中所有裝置的分層次表達模型,也是/sys檔案系統管理裝置的最重要的目錄結構)

sys/dev

該目錄下維護一個按照字元裝置和塊裝置的主次號碼(major:minor)連結到真是裝置(/sys/devices)的符號連結檔案。

/sys/class

該目錄下包含所有註冊在kernel裡面的裝置型別,這是按照裝置功能分類的裝置模型,每個裝置型別表達具有一種功能的裝置。每個裝置型別子目錄下都是這種哦哦那個裝置型別的各種具體裝置的符號連結,這些連結指向/sys/devices/name下的具體裝置。裝置型別和裝置並沒有一一對應的關係,一個物理裝置可能具備多種裝置型別;一個裝置型別只表達具有一種功能的裝置,比如:系統所有輸入裝置都會出現在/sys/class/input之下,而不論它們是以何種匯流排連線到系統的。(/sys/class也是構成linux統一裝置模型的一部分)

/sys/block

該目錄下的所有子目錄代表著系統中當前被發現的所有塊裝置。按照功能來說防止在/sys/class下會更合適,但由於歷史遺留因素而一直存在於/sys/block,但從linux2.6.22核心開始這部分就已經標記為過去時,只有打開了CONFIG_SYSFS_DEPRECATED配置編譯才會有這個目錄存在,並且其中的內容在從linux2.6.26版本開始已經正式移到了/sys/class/block,舊的介面/sys/block為了向後相容而保留存在,但其中的內容已經變為了指向它們在/sys/devices/中真實裝置的符號連結檔案。

/sys/bus

該目錄下的每個子目錄都是kernel支援並且已經註冊了的匯流排型別。這是核心裝置按照匯流排型別分層放置的目錄結構,/sys/devices中的所有裝置都是連線於某種匯流排之下的,bus子目錄下的每種具體匯流排之下可以找到每個具體裝置的符號連結,

一般來說每個子目錄(匯流排型別)下包含兩個子目錄,一個是devices,另一個是drivers;其中devices下是這個匯流排型別下的所有裝置,這些裝置都是符號連結,它們分別指向真正的裝置(/sys/devices/name/);而drivers下是所有註冊在這個總線上的驅動,每個driver子目錄下 是一些可以觀察和修改的driver引數。

(它也是構成linux統一裝置模型的一部分)

/sys/fs

按照設計,該目錄使用來描述系統中所有的檔案系統,包括檔案系統本身和按照檔案系統分類存放的已掛載點。

/sys/kernel

這個目錄下存放的是核心中所有可調整的引數

/sys/firmware

該目錄下包含對韌體物件(firmware object)和屬性進行操作和觀察的介面,即這裡是系統載入韌體機制的對使用者空間的介面.(關於韌體有專用於韌體載入的一套API)

/sys/hypervisor

該目錄是與虛擬化Xen相關的裝置。(Xen是一個開放原始碼的虛擬機器監視器)

/sys/module

該目錄下有系統中所有的模組資訊,不論這些模組是以內聯(inlined)方式編譯到核心映像檔案中還是編譯為外模組(.ko檔案),都可能出現在/sys/module中。即module目錄下包含了所有的被載入kernel的模組。

/sys/power

該目錄是系統中的電源選項,對正在使用的power子系統的描述。這個目錄下有幾個屬性檔案可以用於控制整個機器的電源狀態,如可以向其中寫入控制命令讓機器關機/重啟等等。

4、裝置模型的基本概念

下圖是嵌入式系統常見的硬體拓撲的一個示例:


硬體拓撲描述Linux裝置模型中四個重要概念中三個:Bus,Class和Device(第四個為Device Driver,後面會說)。

Bus(匯流排):Linux認為(可以參考include/linux/device.h中struct bus_type的註釋),匯流排是CPU和一個或多個裝置之間資訊互動的通道。而為了方便裝置模型的抽象,所有的裝置都應連線到總線上(無論是CPU內部匯流排、虛擬的匯流排還是“platform Bus”)。

Class(分類):在Linux裝置模型中,Class的概念非常類似面向物件程式設計中的Class(類),它主要是集合具有相似功能或屬性的裝置,這樣就可以抽象出一套可以在多個裝置之間共用的資料結構和介面函式。因而從屬於相同Class的裝置的驅動程式,就不再需要重複定義這些公共資源,直接從Class中繼承即可。

Device(裝置):抽象系統中所有的硬體裝置,描述它的名字、屬性、從屬的Bus、從屬的Class等資訊。

Device Driver(驅動):Linux裝置模型用Driver抽象硬體裝置的驅動程式,它包含裝置初始化、電源管理相關的介面實現。而Linux核心中的驅動開發,基本都圍繞該抽象進行(實現所規定的介面函式)。

注:什麼是Platform Bus? 
在計算機中有這樣一類裝置,它們通過各自的裝置控制器,直接和CPU連線,CPU可以通過常規的定址操作訪問它們(或者說訪問它們的控制器)。這種連線方式,並不屬於傳統意義上的匯流排連線。但裝置模型應該具備普適性,因此Linux就虛構了一條Platform Bus,供這些裝置掛靠。

4.1 裝置模型的核心思想

Linux裝置模型的核心思想是(通過xxx手段,實現xxx目的):

1. 用Device(struct device)和Device Driver(struct device_driver)兩個資料結構,分別從“有什麼用”和“怎麼用”兩個角度描述硬體裝置。這樣就統一了編寫裝置驅動的格式,使驅動開發從論述題變為填空體,從而簡化了裝置驅動的開發。

2. 同樣使用Device和Device Driver兩個資料結構,實現硬體裝置的即插即用(熱拔插)。 
在Linux核心中,只要任何Device和Device Driver具有相同的名字,核心就會執行Device Driver結構中的初始化函式(probe),該函式會初始化裝置,使其為可用狀態。 而對大多數熱拔插裝置而言,它們的Device Driver一直存在核心中。當裝置沒有插入時,其Device結構不存在,因而其Driver也就不執行初始化操作。當裝置插入時,核心會建立一個Device結構(名稱和Driver相同),此時就會觸發Driver的執行。這就是即插即用的概念。

3. 通過"Bus-->Device”型別的樹狀結構解決裝置之間的依賴,而這種依賴在開關機、電源管理等過程中尤為重要。 
試想,一個裝置掛載在一條總線上,要啟動這個裝置,必須先啟動它所掛載的匯流排。很顯然,如果系統中裝置非常多、依賴關係非常複雜的時候,無論是核心還是驅動的開發人員,都無力維護這種關係。 
而裝置模型中的這種樹狀結構,可以自動處理這種依賴關係。啟動某一個裝置前,核心會檢查該裝置是否依賴其它裝置或者匯流排,如果依賴,則檢查所依賴的物件是否已經啟動,如果沒有,則會先啟動它們,直到啟動該裝置的條件具備為止。而驅動開發人員需要做的,就是在編寫裝置驅動時,告知核心該裝置的依賴關係即可。

4. 使用Class結構,在裝置模型中引入面向物件的概念,這樣可以最大限度地抽象共性,減少驅動開發過程中的重複勞動,降低工作量。

相關推薦

Linux 裝置模型基本概念

1、裝置模型引入 Linux 2.6核心最初為了應付電源管理的需要,提出了一個裝置模型來管理所有的裝置。在物理上,外設之間是有一種層次關係的,比如把一個U盤插到筆記本上,實際上這個U盤是接在一個USB Hub上,USB Hub又是接在USB 2.0 Host Contro

密碼學基本概念

密碼學區塊鏈兄弟社區,區塊鏈技術專業問答先行者,中國區塊鏈技術愛好者聚集地作者:於中陽來源:區塊鏈兄弟原文鏈接:http://www.blockchainbrother.com/article/72著權歸作者所有。商業轉載請聯系作者獲得授權,非商業轉載請註明出處。1.發送者和接收者發送者(sender)即是發

JavaScript JavaScript的基本概念

前面幾節熱身完畢,現在我們要開始真正開始去學習JS了。 學習JS首先我們要了解的是幾個名詞: 1.字面量 2.變數 3.運算子 4.關鍵字 5.資料型別 6.函式 現在我們就開始學習JS的語法吧。 1.字面量   所謂的字面量其實所謂的字面量就是指它字面上的意思,比如一個數字‘3.14’

Linux下的基本指令

文章目錄 1.檔案系統層次結構 1.1根目錄下重要的目錄 2. 對目錄進行操作 2.1 樹狀目錄結構的解釋 2.2 目錄的基本命令 1. cp 指令:複製一個或多個檔案

linux程序管理之概念

一、程序和執行緒的概念 1.程序和執行緒的定義   程序並不只是一段可以執行的程式碼,也包含了執行程式碼所需要的資源。   在作業系統來看,程序是資源管理的最小單元,而我們又知道,執行緒是程式執行的最小單元。   話說回來,Linux系統至少有一個程序,一個程式可以對應多個程序,一個程序只能對應一個程

Oracle的一些基本概念

1、超鍵、候選鍵、主鍵、外來鍵 ☆超鍵(superkey):在關係中能唯一標識元組的屬性集,在一個關係型資料表中,超鍵可以有多個,一個屬性可以被稱為超鍵,多個屬性集也可以被稱為超鍵 (超鍵包含主鍵和候選鍵)。 ☆候選鍵(candidate key):不含有多餘屬性的超鍵稱為候選鍵,就是去掉任何一個屬性都不

Js基本概念

1. <script></script>元素應該放在<body>元素內。因為如果在<head>元素內,那麼所有的Js程式碼都要被下載、解析、執行完成後才可以呈現頁面的內容。即瀏覽器遇到<body>標籤。這樣會導致在呈現頁面時出現延遲。所有的

Linux系統常用基本操作

一、Linux命令列 [[email protected] ~]$ [[email protected] ~]# 1、user、root 當前操作的使用者; 2、@bigdata

談談我對雲端計算的認識之基本概念

雲端計算這個概念估計已經對於IT人士來說,估計已經是爛大街了。但對於外行來說聽起來還是挺模糊的,好像和天上的雲有啥關係似的,考慮到部分對雲端計算不太瞭解的人,我這裡大概說一下基本概念。 什麼是雲端計算 雲端計算是一種基於網際網路的運算,在其中共享資源、軟

E-R圖的基本概念

可能是因為物聯網這個詞本身的概念範圍太廣了。作為一名物聯網專業的學生,也是累,什麼都搞搞。出到社會還要和電腦科學專業的人搶飯碗。這不。。。學完嵌入式後,來學資料庫了。 鑑於聽別人說學好資料庫,不愁找飯碗,因此本著既學之,則安之的原則,為了達到把書越讀越薄的目的

嵌入式Linux裝置驅動開發筆記

一、Linux裝置的分類 字元裝置、塊裝置、網路裝置,三種裝置之間的區別是資料的互動模式,分別為: 位元組流、資料塊、資料包。 二、VFS核心結構體 VFS核心結構體定義在”linux/fs.h”標頭檔案中。 1、struct inode結構體 記

常用 Linux 命令的基本使用

1常用 Linux 命令的基本使用 1.1小技巧 ctrl + shift + = 放大終端視窗的字型顯示 ctrl + - 縮小終端視窗的字型顯示 在敲出 檔案/目錄/命令 的前幾個字母之後,按下 tab 鍵 如果輸入的沒有歧義,系統會自動補全 如果還存在其他 檔案/目錄/命令,再按

Linux裝置樹學習日記裝置樹簡單介紹

一、linux裝置樹簡介1.    裝置樹是一種描述硬體的資料結構,它起源於openfirmware,採用裝置樹後,許多硬體的細節可以直接通過它傳遞給linux,而不需要在核心中進行大量冗餘編碼。2.    裝置樹由一系列被命名的節點(Node)和屬性(property)組成

圖的基本概念

1、含平行邊的圖稱作多重圖,既不含平行邊也不含環的圖稱作簡單圖。 2、稱度數為1的頂點為懸掛頂點,與它關聯的邊稱為懸掛邊。 3、握手定理:在任何無向圖中,所有頂點的度數之和等於邊數的2倍。 4、在任何有向圖中,所有頂點的度數之和等於邊數的2倍,所有頂點的入

Spring中IoC的基本概念

什麼是IoC 在實際應用的開發當中,需要儘量避免和降低物件之間的依賴關係,即降低耦合度。而Ioc就是解決了一般業務物件之間、業務物件與持久層之間存在的各種依賴關係。 在沒有Ioc的實現中,物件都是由程式的內部程式碼來控制的。當一個物件需要依賴另一個物件時,

linux裝置驅動模型架構分析——概述

概述 LDD3中說:“Linux核心需要一個對系統結構的一般性描述。”這個描述就是linux裝置驅動模型(下面簡稱為LDDM)。LDDM不是獨立存在,其體系如下圖所示: LDDM體系結構 對架構的每一部分本文都會開闢獨立的章節進行描述。暫且拋開這個架構,首先從總體上了

linux 基本命令

達內 linux 筆記 UNIX誕生,1970年1月1日 用戶-------->內核-------》硬件 發行版的名稱/版本由發行方決定 – Red Hat Enterprise Linux 5/6/7 – Suse Linux Enterprise 12 – Debian Linu

Linux基本指令

linux基本操作指令一、管理虛擬機 [kiosk@foundation20 Desktop]$ rht-vmctl start desktop //開啟虛擬機 [kiosk@foundation20 Desktop]$ rht-vmctl view desktop //顯示虛擬機 [ki

Linux文件系統學習之相關概念???

正是 range 不同的 struct pan 根據 inode 存在 opera “一切皆是文件”是 Unix/Linux 的基本哲學之一。不僅普通的文件,目錄、字符設備、塊設備、套接字等在 Unix/Linux 中都是以文件被對待;它們雖然類型不同,但是對其提供的卻是同

Elasticsearch入門:Elasticsearch的基本概念

一.Elasticsearch定義 Elasticsearch是一個開源的高度可擴充套件的全文搜尋和分析引擎。它允許您快速、實時的儲存、搜尋和分析大資料。它通常為具有複雜的搜尋特性和需求的應用提供底層引擎或技術。 Elasticsearch可以用於以下的一些場景: 運營一個網上商城