日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 运维知识 > linux >内容正文

linux

linux设备驱动模型架构分析(一)——概述

發(fā)布時(shí)間:2023/12/31 linux 33 豆豆
生活随笔 收集整理的這篇文章主要介紹了 linux设备驱动模型架构分析(一)——概述 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

概述

LDD3中說(shuō):“Linux內(nèi)核需要一個(gè)對(duì)系統(tǒng)結(jié)構(gòu)的一般性描述。”這個(gè)描述就是linux設(shè)備驅(qū)動(dòng)模型(下面簡(jiǎn)稱為L(zhǎng)DDM)。LDDM不是獨(dú)立存在,其體系如下圖所示:


LDDM體系結(jié)構(gòu)


對(duì)架構(gòu)的每一部分本文都會(huì)開(kāi)辟獨(dú)立的章節(jié)進(jìn)行描述。暫且拋開(kāi)這個(gè)架構(gòu),首先從總體上了解一下LDDM。

LDDM與驅(qū)動(dòng)程序密切相關(guān),而驅(qū)動(dòng)程序處于linux系統(tǒng)中的什么位置呢?我們自頂向下一步步來(lái)說(shuō),先看下圖[以下內(nèi)容以http://www.wowotech.net/sort/device_model中的內(nèi)容為主體結(jié)合自己的認(rèn)識(shí)和對(duì)于4.1內(nèi)核的修改,這個(gè)系列文章非常好,推薦],linux由五個(gè)部分組成



1. Process Scheduler,也稱作進(jìn)程管理、進(jìn)程調(diào)度。負(fù)責(zé)管理CPU資源,以便讓各個(gè)進(jìn)程可以以盡量公平的方式訪問(wèn)CPU

2. Memory Manager,內(nèi)存管理。負(fù)責(zé)管理Memory(內(nèi)存)資源,以便讓各個(gè)進(jìn)程可以安全地共享機(jī)器的內(nèi)存資源。另外,內(nèi)存管理會(huì)提供虛擬內(nèi)存的機(jī)制,該機(jī)制可以讓進(jìn)程使用多于系統(tǒng)可用Memory的內(nèi)存,不用的內(nèi)存會(huì)通過(guò)文件系統(tǒng)保存在外部非易失存儲(chǔ)器中,需要使用的時(shí)候,再取回到內(nèi)存中。

3. VFSVirtual File System),虛擬文件系統(tǒng)。Linux內(nèi)核將不同功能的外部設(shè)備,例如Disk設(shè)備(硬盤(pán)、磁盤(pán)、NAND FlashNor Flash等)、輸入輸出設(shè)備、顯示設(shè)備等等,抽象為可以通過(guò)統(tǒng)一的文件操作接口(openclosereadwrite等)來(lái)訪問(wèn)。這就是Linux系統(tǒng)“一切皆是文件”的體現(xiàn)(其實(shí)Linux做的并不徹底,因?yàn)?/span>CPU、內(nèi)存、網(wǎng)絡(luò)等還不是文件,如果真的需要一切皆是文件)。

4. Network,網(wǎng)絡(luò)子系統(tǒng)。負(fù)責(zé)管理系統(tǒng)的網(wǎng)絡(luò)設(shè)備,并實(shí)現(xiàn)多種多樣的網(wǎng)絡(luò)標(biāo)準(zhǔn)。

5. IPCInter-Process Communication),進(jìn)程間通信。IPC不管理任何的硬件,它主要負(fù)責(zé)Linux系統(tǒng)中進(jìn)程之間的通信。

其中與設(shè)備驅(qū)動(dòng)相關(guān)的是VFS子系統(tǒng),VFS子系統(tǒng)包含5個(gè)模塊:



1. Device Drivers,設(shè)備驅(qū)動(dòng),用于控制所有的外部設(shè)備及控制器。由于存在大量不能相互兼容的硬件設(shè)備(特別是嵌入式產(chǎn)品),所以也有非常多的設(shè)備驅(qū)動(dòng)。因此,Linux內(nèi)核中將近一半的Source Code都是設(shè)備驅(qū)動(dòng),大多數(shù)的Linux底層工程師(特別是國(guó)內(nèi)的企業(yè))都是在編寫(xiě)或者維護(hù)設(shè)備驅(qū)動(dòng),而無(wú)暇估計(jì)其它內(nèi)容(它們恰恰是Linux內(nèi)核的精髓所在)。

2. Device Independent Interface, 該模塊定義了描述硬件設(shè)備的統(tǒng)一方式(統(tǒng)一設(shè)備模型),所有的設(shè)備驅(qū)動(dòng)都遵守這個(gè)定義,可以降低開(kāi)發(fā)的難度。同時(shí)可以用一致的形勢(shì)向上提供接口。這一層體現(xiàn)了linux設(shè)備驅(qū)動(dòng)模型的核心思想。

3. Logical Systems,每一種文件系統(tǒng),都會(huì)對(duì)應(yīng)一個(gè)Logical System(邏輯文件系統(tǒng)),它會(huì)實(shí)現(xiàn)具體的文件系統(tǒng)邏輯。使用mount命令可以看到。

4. System Independent Interface,該模塊負(fù)責(zé)以統(tǒng)一的接口(塊設(shè)備和字符設(shè)備)表示硬件設(shè)備和邏輯文件系統(tǒng),這樣上層軟件就不再關(guān)心具體的硬件形態(tài)了。

5. System Call?Interface,系統(tǒng)調(diào)用接口,向用戶空間提供訪問(wèn)文件系統(tǒng)和硬件設(shè)備的統(tǒng)一的接口。

從圖中可以看出,VFS包含了設(shè)備驅(qū)動(dòng)的大部分內(nèi)容(網(wǎng)絡(luò)驅(qū)動(dòng)不屬于“文件”),設(shè)備無(wú)關(guān)接口體現(xiàn)的就是linux設(shè)備驅(qū)動(dòng)模型的核心思想。

LDDM核心思想

如前所述,由于Linux支持世界上幾乎所有的、不同功能的硬件設(shè)備(這是Linux的優(yōu)點(diǎn)),導(dǎo)致Linux內(nèi)核中有一半的代碼是設(shè)備驅(qū)動(dòng),而且隨著硬件的快速升級(jí)換代,設(shè)備驅(qū)動(dòng)的代碼量也在快速增長(zhǎng)。為了降低設(shè)備多樣性帶來(lái)的Linux驅(qū)動(dòng)開(kāi)發(fā)的復(fù)雜度,以及設(shè)備熱拔插處理、電源管理等,Linux內(nèi)核提出了設(shè)備模型(也稱作Driver Model)的概念。設(shè)備模型將硬件設(shè)備歸納、分類,然后抽象出一套標(biāo)準(zhǔn)的數(shù)據(jù)結(jié)構(gòu)和接口。驅(qū)動(dòng)的開(kāi)發(fā),就簡(jiǎn)化為對(duì)內(nèi)核所規(guī)定的數(shù)據(jù)結(jié)構(gòu)的填充和實(shí)現(xiàn)

因此,Linux設(shè)備驅(qū)動(dòng)模型是一種抽象,為內(nèi)核建立起統(tǒng)一的設(shè)備模型。其目的是:

提供一個(gè)對(duì)系統(tǒng)結(jié)構(gòu)的一般性抽象描述。

LDDM跟蹤所有系統(tǒng)所知道的設(shè)備,以便讓LDDM核心程序協(xié)調(diào)驅(qū)動(dòng)與新設(shè)備之間的關(guān)系。

內(nèi)核使用Linux設(shè)備驅(qū)動(dòng)模型支持如下任務(wù):

1. 電源管理和系統(tǒng)關(guān)機(jī)

2. 與用戶空間通信

???sys虛擬文件系統(tǒng)的實(shí)現(xiàn)與設(shè)備模型密切相關(guān),并且向外界展示了它所表述的結(jié)構(gòu)。向用戶空間所提供的系統(tǒng)信息,以及改變操作參數(shù)的接口,都要通過(guò)/sys文件系統(tǒng)實(shí)現(xiàn),即通過(guò)設(shè)備模型實(shí)現(xiàn)。

3. 熱插拔設(shè)備

???處理與用戶空間進(jìn)行熱插拔設(shè)備的通信是通過(guò)設(shè)備模型管理的。

4. 設(shè)備類型

???設(shè)備模型包括了對(duì)設(shè)備分類的機(jī)制,它會(huì)在更高的功能層上描述這些設(shè)備,并使得這些設(shè)備對(duì)用戶空間可見(jiàn)。尤其是將命名設(shè)備的功能從內(nèi)核層轉(zhuǎn)移到用戶層,大大提高了設(shè)備管理的靈活性。

5. 對(duì)象生命周期管理

???設(shè)備模型實(shí)現(xiàn)一系列機(jī)制以處理對(duì)象的生命周期、對(duì)象之間的關(guān)系,以及這些對(duì)象在用戶空間中的表示。簡(jiǎn)化編程人員創(chuàng)建和管理對(duì)象的工作。

Linux設(shè)備驅(qū)動(dòng)模型使用一系列抽象(面向?qū)ο笤O(shè)計(jì)里的類),提供統(tǒng)一的設(shè)備管理視圖,這些抽象包括:總線、類、設(shè)備和設(shè)備驅(qū)動(dòng)。

Bus(總線):總線是CPU和一個(gè)或多個(gè)設(shè)備之間信息交互的通道。而為了方便設(shè)備模型的抽象,所有的設(shè)備都應(yīng)連接到總線上無(wú)論是CPU內(nèi)部總線、虛擬的總線還是“platform Bus在計(jì)算機(jī)中有這樣一類設(shè)備,它們通過(guò)各自的設(shè)備控制器,直接和CPU連接,CPU可以通過(guò)常規(guī)的尋址操作訪問(wèn)它們(或者說(shuō)訪問(wèn)它們的控制器)。這種連接方式,并不屬于傳統(tǒng)意義上的總線連接。但設(shè)備模型應(yīng)該具備普適性,因此Linux就虛構(gòu)了一條Platform Bus,供這些設(shè)備掛靠。

Class(分類):在Linux設(shè)備模型中,Class的概念非常類似面向?qū)ο蟪绦蛟O(shè)計(jì)中的Class(類),它主要是集合具有相似功能或?qū)傩缘脑O(shè)備,這樣就可以抽象出一套可以在多個(gè)設(shè)備之間共用的數(shù)據(jù)結(jié)構(gòu)和接口函數(shù)。因而從屬于相同Class的設(shè)備的驅(qū)動(dòng)程序,就不再需要重復(fù)定義這些公共資源,直接從Class中繼承即可。

Device(設(shè)備):抽象系統(tǒng)中所有的硬件設(shè)備,描述它的名字、屬性、從屬的Bus、從屬的Class等信息。

另外,linux驅(qū)動(dòng)模型還有一類抽象,Device Driver(設(shè)備驅(qū)動(dòng))Linux設(shè)備模型用Driver抽象硬件設(shè)備的驅(qū)動(dòng)程序,它包含設(shè)備初始化、電源管理相關(guān)的接口實(shí)現(xiàn)。而Linux內(nèi)核中的驅(qū)動(dòng)開(kāi)發(fā),基本都圍繞該抽象進(jìn)行(實(shí)現(xiàn)所規(guī)定的接口函數(shù))。

上面提到過(guò),Linux內(nèi)核通過(guò)sys文件系統(tǒng)展示了設(shè)備驅(qū)動(dòng)模型的內(nèi)在結(jié)構(gòu),我們通過(guò)sys文件系統(tǒng)來(lái)看看上述抽象如何組織在一起,如何有序的管理linux設(shè)備:



可以看到,linux驅(qū)動(dòng)模型是個(gè)復(fù)雜的體系,包括設(shè)備樹(shù)、總線樹(shù)、類樹(shù),即使一個(gè)簡(jiǎn)單的系統(tǒng)設(shè)備模型也會(huì)包含幾百個(gè)節(jié)點(diǎn),但是Linux設(shè)備驅(qū)動(dòng)模型代碼會(huì)處理好這些關(guān)系,模型隱藏在交互背后。

綜上所述,Linux設(shè)備驅(qū)動(dòng)模型的核心思想是

?1. Devicestruct device)和Device Driverstruct device_driver)兩個(gè)數(shù)據(jù)結(jié)構(gòu),分別從“有什么用”“怎么用”兩個(gè)角度描述硬件設(shè)備。這樣就統(tǒng)一了編寫(xiě)設(shè)備驅(qū)動(dòng)的格式,使驅(qū)動(dòng)開(kāi)發(fā)從論述題變?yōu)樘羁阵w,從而簡(jiǎn)化了設(shè)備驅(qū)動(dòng)的開(kāi)發(fā)。

2. 同樣使用DeviceDevice Driver兩個(gè)數(shù)據(jù)結(jié)構(gòu),實(shí)現(xiàn)硬件設(shè)備的即插即用(熱拔插)。

Linux內(nèi)核中,只要任何DeviceDevice Driver具有相同的名字,內(nèi)核就會(huì)執(zhí)行Device Driver結(jié)構(gòu)中的初始化函數(shù)(probe),該函數(shù)會(huì)初始化設(shè)備,使其為可用狀態(tài)。

而對(duì)大多數(shù)熱拔插設(shè)備而言,它們的Device Driver一直存在內(nèi)核中。當(dāng)設(shè)備沒(méi)有插入時(shí),其Device結(jié)構(gòu)不存在,因而其Driver也就不執(zhí)行初始化操作。當(dāng)設(shè)備插入時(shí),內(nèi)核會(huì)創(chuàng)建一個(gè)Device結(jié)構(gòu)(名稱和Driver相同),此時(shí)就會(huì)觸發(fā)Driver的執(zhí)行。這就是即插即用的概念。

3. 通過(guò)"Bus-->Device”類型的樹(shù)狀結(jié)構(gòu)解決設(shè)備之間的依賴,而這種依賴在開(kāi)關(guān)機(jī)、電源管理等過(guò)程中尤為重要。

試想,一個(gè)設(shè)備掛載在一條總線上,要啟動(dòng)這個(gè)設(shè)備,必須先啟動(dòng)它所掛載的總線。很顯然,如果系統(tǒng)中設(shè)備非常多、依賴關(guān)系非常復(fù)雜的時(shí)候,無(wú)論是內(nèi)核還是驅(qū)動(dòng)的開(kāi)發(fā)人員,都無(wú)力維護(hù)這種關(guān)系。

而設(shè)備模型中的這種樹(shù)狀結(jié)構(gòu),可以自動(dòng)處理這種依賴關(guān)系。啟動(dòng)某一個(gè)設(shè)備前,內(nèi)核會(huì)檢查該設(shè)備是否依賴其它設(shè)備或者總線,如果依賴,則檢查所依賴的對(duì)象是否已經(jīng)啟動(dòng),如果沒(méi)有,則會(huì)先啟動(dòng)它們,直到啟動(dòng)該設(shè)備的條件具備為止。而驅(qū)動(dòng)開(kāi)發(fā)人員需要做的,就是在編寫(xiě)設(shè)備驅(qū)動(dòng)時(shí),告知內(nèi)核該設(shè)備的依賴關(guān)系即可。

4. 使用Class結(jié)構(gòu),在設(shè)備模型中引入面向?qū)ο蟮母拍?#xff0c;這樣可以最大限度地抽象共性,減少驅(qū)動(dòng)開(kāi)發(fā)過(guò)程中的重復(fù)勞動(dòng),降低工作量。


總結(jié)

以上是生活随笔為你收集整理的linux设备驱动模型架构分析(一)——概述的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。

如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。