Linux系統(tǒng)的硬件設(shè)備驅(qū)動(dòng)的底層結(jié)構(gòu)講解

什么是驅(qū)動(dòng)?
最通俗的解釋就是“驅(qū)使硬件設(shè)備行動(dòng)”
作用?
設(shè)備驅(qū)動(dòng)與底層硬件直接打交道,按照硬件設(shè)備的具體工作方式讀寫設(shè)備寄存器,完成設(shè)備的輪詢、中斷處理、DMA通信,進(jìn)行物理內(nèi)存向虛擬內(nèi)存的映射,最終使通信設(shè)備能夠收發(fā)數(shù)據(jù),使顯示設(shè)備能夠顯示文字和畫面,使存儲(chǔ)設(shè)備能夠記錄文件號數(shù)據(jù)
計(jì)算機(jī)系統(tǒng)的硬件主要有cpu、存儲(chǔ)器、外設(shè)組成。但是隨著IC制造工藝的發(fā)展,目前,芯片的集成度越來越高,往往cpu內(nèi)部就集成了存儲(chǔ)器和外設(shè)適配器。ARM處理器集成了UART、I2C控制器(2==平方)、USB控制器、SDRAM控制器等
驅(qū)動(dòng)針對的對象是存儲(chǔ)器和外設(shè)(包括cpu內(nèi)部集成的存儲(chǔ)器和外設(shè)),而不是針對cpu核。Linux將存儲(chǔ)器和外設(shè)分為3個(gè)基礎(chǔ)大類:字符設(shè)備、塊設(shè)備、網(wǎng)絡(luò)設(shè)備
字符設(shè)備之那些必須以串行順序依次進(jìn)行訪問的設(shè)備,如觸摸屏、磁帶驅(qū)動(dòng)器、鼠標(biāo)等??稍O(shè)備可以按照任意順序進(jìn)行訪問,以塊為單位進(jìn)行操作,如硬盤、軟驅(qū)等。字符設(shè)備不經(jīng)過系統(tǒng)的快速緩沖,而塊設(shè)備經(jīng)過系統(tǒng)的快速緩沖。但是,字符設(shè)備和塊設(shè)備并沒有明顯的界限,如flash設(shè)備符合塊設(shè)備的特點(diǎn),但是我們?nèi)匀豢梢园阉鳛橐粋€(gè)字符設(shè)備來訪問
在Linux系統(tǒng)中,網(wǎng)絡(luò)設(shè)備面向數(shù)據(jù)包的接收和發(fā)送而設(shè)計(jì),它并不對應(yīng)于文件系統(tǒng)的節(jié)點(diǎn)。內(nèi)核與網(wǎng)絡(luò)設(shè)備的通信和內(nèi)核與字符設(shè)備、塊設(shè)備的通信方式完全不同。
如上圖所示,除網(wǎng)絡(luò)設(shè)備外,字符設(shè)備與塊設(shè)備都被映射到Linux文件系統(tǒng)的文件和目錄,通過文件系統(tǒng)的系統(tǒng)調(diào)用接口open()、write()、read()、close()等函數(shù)即可訪問字符設(shè)備和塊設(shè)備。塊設(shè)備比字符設(shè)備復(fù)雜,在它上面會(huì)首先建立一個(gè)磁盤/Flash文件系統(tǒng),如FAT、Ext3、YAFFS、JFFS等FAT、Ext3、YAFFS、JFFS規(guī)范了文件和目錄在存儲(chǔ)介質(zhì)上的組織
應(yīng)用程序可以使用Linux的系統(tǒng)調(diào)用接口編程,也可由使用c庫函數(shù),出于可移植性的考慮,后者更值得推薦。c庫函數(shù)本身也是通過系統(tǒng)調(diào)用接口而實(shí)現(xiàn)的
在嵌入式系統(tǒng)的設(shè)計(jì)中,LED一般直接由cpu的GPIO控制。GPIO一般有兩組寄存器控制,即一組控制寄存器和一組數(shù)據(jù)寄存器??刂萍拇嫫骺稍O(shè)置GPIO口的工作方式為輸入或輸出。當(dāng)引腳設(shè)置為輸出時(shí),向數(shù)據(jù)寄存器的對應(yīng)位寫入1和0會(huì)分別在引腳上產(chǎn)生高電平和低電平;當(dāng)引腳設(shè)置為輸入時(shí),讀取數(shù)據(jù)寄存器的對應(yīng)位可獲得引腳上相應(yīng)的電平信號。
驅(qū)動(dòng)設(shè)計(jì)的硬件基礎(chǔ)
處理器的分類,如下圖所示:
存儲(chǔ)器可分為只讀存儲(chǔ)器(ROM)、閃存(Flash)、隨機(jī)存取存儲(chǔ)器(RAM)、光介質(zhì)存儲(chǔ)器和磁介質(zhì)存儲(chǔ)器
Nor Flash和cpu的接口屬于典型的類SRAM接口,不需要增加額外的控制電路。Nor Flash的特點(diǎn)是可芯片內(nèi)執(zhí)行,程序可以直接在Nor內(nèi)運(yùn)行。而Nand Fash和cpu的接口必須由相應(yīng)的控制電路進(jìn)行轉(zhuǎn)換,當(dāng)然也可以通過地址線或GPIO產(chǎn)生Nand Flash接口的信號。Nand Flash以塊方式進(jìn)行訪問,不支持芯片內(nèi)執(zhí)行。
Flash的編程原理都是只能將1寫為0,而不能將0寫完1.所以在Flash編程之前必須將對應(yīng)的塊擦除,而擦除的過程就是把所有的位都寫為1的過程,塊內(nèi)的所有字節(jié)變?yōu)?xFF
存儲(chǔ)器的分類,如下圖所示:
原理圖分析:通過閱讀電路板的原理圖獲得各種存儲(chǔ)器、外設(shè)所使用的硬件資源,主要包括存儲(chǔ)器和外設(shè)控制芯片所使用的片選、中斷、DMA資源。通過分析片選得出芯片的內(nèi)存、I/O基地址,通過分析中斷、DMA信號獲得芯片使用的中斷號和DMA通道,歸納出類似下表:
時(shí)序分析:對驅(qū)動(dòng)工程師或硬件工程師而言,時(shí)序分析的意思是讓芯片之間的訪問滿足芯片手冊中時(shí)序圖信號有效的先后順序、采樣建立時(shí)間和保持時(shí)間的要求,在電路板工作不正常的時(shí)候,準(zhǔn)確的定位時(shí)序方面的問題
內(nèi)核及內(nèi)核編程
在設(shè)備驅(qū)動(dòng)方面,Linux2.6相對于Linux2.4有較大的改動(dòng),這主要表現(xiàn)在內(nèi)核API中增加了不少新功能(如內(nèi)存池)、sysfs文件系統(tǒng)、內(nèi)核模塊從.o變?yōu)?ko、驅(qū)動(dòng)模塊編譯方式、模塊使用計(jì)數(shù)、模塊加載和卸載函數(shù)的定義等方面
Linux內(nèi)核主要有進(jìn)程調(diào)度、內(nèi)存管理、虛擬文件系統(tǒng)、網(wǎng)絡(luò)接口和進(jìn)程間通信等5個(gè)子系統(tǒng)組成,如下圖:
在設(shè)備驅(qū)動(dòng)編程中,當(dāng)請求的資源不能滿足時(shí),驅(qū)動(dòng)一般會(huì)調(diào)度其他線程執(zhí)行,并使驅(qū)動(dòng)對應(yīng)的進(jìn)程進(jìn)入睡眠狀態(tài),直到它請求的資源被釋放,才會(huì)被喚醒而紀(jì)念日就緒狀態(tài)
在設(shè)備驅(qū)動(dòng)編程中,如果需要幾個(gè)并發(fā)執(zhí)行的任務(wù),可以啟動(dòng)內(nèi)核線程,啟動(dòng)內(nèi)核線程的函數(shù)為:int kernel_thread(int (*fn)(void *), void *arg, unsigned long flags);
Linux內(nèi)存管理完成為每個(gè)進(jìn)程進(jìn)行虛擬內(nèi)存到物理內(nèi)存的轉(zhuǎn)換。一般而言,Linux的每個(gè)進(jìn)程享有4GB的內(nèi)存空間,0-3GB屬于用戶空間,3-4GB屬于內(nèi)核空間,內(nèi)核空間對常規(guī)內(nèi)存、I/O設(shè)備內(nèi)存以及高端內(nèi)存存在不同的處理方式
虛擬文件系統(tǒng)隱藏了各種硬件的具體細(xì)節(jié),為所有的設(shè)備提供了統(tǒng)一的接口。而且,它獨(dú)立于各個(gè)具體的文件系統(tǒng),是對各種文件系統(tǒng)的一個(gè)抽象,它使用super block存放文件系統(tǒng)相關(guān)信息,使用索引節(jié)點(diǎn)inode存放文件的物理信息,使用目錄項(xiàng)dentry存放文件的邏輯信息
Linux系統(tǒng)只能通過系統(tǒng)調(diào)用和硬件中斷完成從用戶空間到內(nèi)核空間的控制轉(zhuǎn)移。
相關(guān)文章
win10系統(tǒng)檢測未簽名驅(qū)動(dòng)程序方法教程
Win10系統(tǒng)安裝驅(qū)動(dòng)程序都會(huì)驗(yàn)證文件數(shù)字簽名,但是這也難免有一些未簽名驅(qū)動(dòng)逃過了這些驗(yàn)證,混進(jìn)Win10系統(tǒng)中。那么怎么檢測Win10系統(tǒng)中的未簽名驅(qū)動(dòng),一起到下文了解一下2016-04-14Linux系統(tǒng)中USB驅(qū)動(dòng)程序的工作流程詳解
這篇文章主要介紹了Linux系統(tǒng)中USB驅(qū)動(dòng)程序的工作流程詳解,文中對USB驅(qū)動(dòng)的程序編寫方面也有相關(guān)知識的補(bǔ)充,需要的朋友可以參考下2016-04-12Win10系統(tǒng)不斷自動(dòng)安裝HP打印機(jī)驅(qū)動(dòng)且報(bào)錯(cuò)0x80240017的解決方法
近日有些朋友反饋在更新HP打印機(jī)時(shí),遇到錯(cuò)誤提示“HP driver update for HP LaserJet M1530 MFP Series PCL 6 - 錯(cuò)誤 0x80240017”,且會(huì)不停自動(dòng)安裝,而安裝總是失敗,2016-04-01Win10 RedStone紅石IoT物聯(lián)網(wǎng)預(yù)覽版14279的下載 修復(fù)樹莓派3驅(qū)動(dòng)
今天有網(wǎng)友爆料了Win10 RedStone紅石IoT物聯(lián)網(wǎng)預(yù)覽版14279的下載地址,這個(gè)版本修復(fù)了樹莓派3等設(shè)備的驅(qū)動(dòng)問題,還修復(fù)了 .NET本地工具鏈等其他問題,需要的朋友可以進(jìn)來下2016-03-31win8系統(tǒng)安裝網(wǎng)絡(luò)打印機(jī)圖文教程 win8系統(tǒng)怎么安裝打印機(jī)驅(qū)動(dòng)
這篇文章主要為大家介紹了win8系統(tǒng)安裝網(wǎng)絡(luò)打印機(jī)圖文教程,在win8系統(tǒng)下怎么安裝網(wǎng)絡(luò)打印機(jī),感興趣的小伙伴們可以參考一下2016-03-30Win10系統(tǒng)查看驅(qū)動(dòng)是否完全安裝的技巧有哪些
這篇文章主要為大家詳細(xì)介紹了Win10系統(tǒng)查看驅(qū)動(dòng)是否完全安裝的技巧有哪些,我們該怎樣查看是否已經(jīng)安裝了全部驅(qū)動(dòng)呢?感興趣的小伙伴們可以參考一下2016-03-28WinXP系統(tǒng)提示未安裝打印機(jī)驅(qū)動(dòng)的故障原因及解決方法
WinXP系統(tǒng)在安裝打印機(jī)驅(qū)動(dòng)時(shí),總會(huì)提示“未安裝打印機(jī)驅(qū)動(dòng)。拒絕訪問”,這是怎么回事呢?這種情況怎么辦呢?本文將提供WinXP系統(tǒng)提示未安裝打印機(jī)驅(qū)動(dòng)的故障原因及解決方2016-03-26Win10安裝驅(qū)動(dòng)時(shí)出現(xiàn)藍(lán)屏錯(cuò)誤cmudaxp.sys怎么辦?
Win10安裝驅(qū)動(dòng)時(shí)出現(xiàn)藍(lán)屏錯(cuò)誤cmudaxp.sys怎么辦?針對此問題,下面小編就給大家?guī)斫鉀Q方法,希望可以幫助到大家2016-03-21win7系統(tǒng)電腦怎么卸載打印機(jī)驅(qū)動(dòng)?win7系統(tǒng)卸載打印機(jī)驅(qū)動(dòng)的方法
win7系統(tǒng)電腦怎么卸載打印機(jī)驅(qū)動(dòng)?針對此問題,下面小編就給大家?guī)韜in7系統(tǒng)卸載打印機(jī)驅(qū)動(dòng)的方法,希望可以幫助到大家2016-03-17Win10安裝GeForce顯卡驅(qū)動(dòng)364.47崩潰藍(lán)屏怎么辦?官方公布解決方法
NVIDIA昨晚發(fā)布了最新款游戲驅(qū)動(dòng)GeForce 364.47,一口氣優(yōu)化了《全境封鎖》、《殺手》、《極品飛車19》等五款游戲,并支持Vulkan API,但是很快就有不少用戶報(bào)告了各種問題2016-03-09