裝置模型一 基本概念

2021-07-28 02:00:57 字數 2402 閱讀 3595

前言

裝置驅動模型研究好一陣子了,但是很快就忘了,不得不重新再研究,打算記錄下來,裝置驅動模型系列打算參考wowo科技系列的文章(以及自己的理解講訴一下,開篇的話引入wowo關於驅動模型的第一篇(寫的太好,沒辦法)

linux支援世界上幾乎所有的、不同功能的硬體裝置(這是linux的優點),導致linux核心中有一半的**是裝置驅動,而且隨著硬體的快速公升級換代,裝置驅動的**量也在快速增長。個人意見,這種現象打破了「簡潔就是美」的理念,是醜陋的。它導致linux核心看上去非常臃腫、雜亂、不易維護。但蝸蝸也知道,這不是linux的錯,linux是乙個單核心,它必須面對裝置的多樣性,並實現對應的驅動。

為了降低裝置多樣性帶來的linux驅動開發的複雜度,以及裝置熱拔插處理、電源管理等,linux核心提出了裝置模型(也稱作driver model)的概念。裝置模型將硬體裝置歸納、分類,然後抽象出一套標準的資料結構和介面。驅動的開發,就簡化為對核心所規定的資料結構的填充和實現。

本文將會從裝置模型的基本概念開始,通過分析核心相應的**,一步一步解析linux裝置模型的實現及使用方法。

linux裝置模型的基本概念

2.1 bus, class, device和device driver的概念

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

硬體拓撲描述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,供這些裝置掛靠。

2.2 裝置模型的核心思想

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

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」型別的樹狀結構(見2.1章節的圖例)解決裝置之間的依賴,而這種依賴在開關機、電源管理等過程中尤為重要。

試想,乙個裝置掛載在一條匯流排上,要啟動這個裝置,必須先啟動它所掛載的匯流排。很顯然,如果系統中裝置非常多、依賴關係非常複雜的時候,無論是核心還是驅動的開發人員,都無力維護這種關係。

而裝置模型中的這種樹狀結構,可以自動處理這種依賴關係。啟動某乙個裝置前,核心會檢查該裝置是否依賴其它裝置或者匯流排,如果依賴,則檢查所依賴的物件是否已經啟動,如果沒有,則會先啟動它們,直到啟動該裝置的條件具備為止。而驅動開發人員需要做的,就是在編寫裝置驅動時,告知核心該裝置的依賴關係即可。

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

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

linux 2.6核心最初為了應付電源管理的需要,提出了乙個裝置模型來管理所有的裝置。在物理上,外設之間是有一種層次關係的,比如把乙個u盤插到筆記本上,實際上這個u盤是接在乙個usb hub上,usb hub又是接在usb 2.0 host controller ehci 上,最終ehci又是乙個掛...

Linux裝置模型 1 基本概念

1.前言 在 linux核心的整體架構 中,蝸蝸有提到,由於linux支援世界上幾乎所有的 不同功能的硬體裝置 這是linux的優點 導致linux核心中有一半的 是裝置驅動,而且隨著硬體的快速公升級換代,裝置驅動的 量也在快速增長。個人意見,這種現象打破了 簡潔就是美 的理念,是醜陋的。它導致li...

Linux裝置模型 1 基本概念

1.前言 在 linux核心的整體架構 中,蝸蝸有提到,由於linux支援世界上幾乎所有的 不同功能的硬體裝置 這是linux的優點 導致linux核心中有一半的 是裝置驅動,而且隨著硬體的快速公升級換代,裝置驅動的 量也在快速增長。個人意見,這種現象打破了 簡潔就是美 的理念,是醜陋的。它導致li...