Linux驅動學習之什么是驅動?


一、什么是驅動?

1: 驅動一詞的字面意思

2: 物理上的驅動

3: 硬件中的驅動

4: linux內核驅動。軟件層面上的驅動廣義上是指:這一段代碼操作了硬件去動,所以這一段代碼就叫硬件的驅動程序。

狹義上驅動程序就是專指操作系統中用來操控硬件的邏輯方法的部分代碼。而我們這里講的驅動就指的是這個狹義上的驅動。

 

二、Linux驅動的體系架構

1: 分離、分層思想

2: 驅動的上面是系統調用API

3: 驅動的下面是硬件

4: 驅動本身的實現也是基於分離、分層的思想

 

三、模塊化設計的思想

1、微內核和宏內核(操作系統設計的兩種思路)

(1)宏內核(又稱為單內核):將內核從整體上作為一個大過程實現,並同時運行在一個單獨的地址空間。所有的內核服務都在一個地址空間運行,相互之間直接調用函數,簡

單高效。壞處就是緊耦合,一個動了其他的也要跟着動,因為他們都是一起編譯的,就好比我們平時寫的裸機程序一樣,編譯成一個可執行文件的。

(2)微內核:功能被划分成獨立的過程,過程間通過IPC進行通信。模塊化程度高,一個服務失效不會影響另外一個服務。典型如windows

(3)linux:本質上是宏內核,但是又吸收了微內核的模塊化特性,提現在2個層面

2、動態模塊化和靜態模塊化

(1)靜態模塊化:在內核編譯時實現可裁剪,特征是想要功能裁剪改變必須重新編譯

(2)動態模塊化:zImage可以不重新編譯燒錄,甚至可以不關機重啟就實現模塊的安裝和卸載。

 

四、驅動的分類

1、驅動分類

(1)分3類:字符設備驅動、塊設備驅動、網絡設備驅動

(2)分類原則:設備本身讀寫操作的特征差異

時刻要注意一點,我們的驅動本質上是不分類的,因為我們的硬件是不同的,有不同的讀寫特性,所以的硬件是分類的,所以我們的驅動也就要跟着分類了。

2、三類驅動程序詳細對比分析

(1)字符設備,准確的說應該叫“字節設備”,軟件操作設備時是以字節為單位進行的。典型的如LCD、串口、LED、蜂鳴器、觸摸屏······

(2)塊設備,塊設備是相對於字符設備定義的,塊設備被軟件操作時是以塊(多個字節構成的一個單位)為單位的。設備的塊大小是設備本身設計時定義好的,軟件是不能去更

改的,不同設備的塊大小可以不一樣。常見的塊設備都是存儲類設備,如:硬盤、NandFlash、iNand、SD····操作塊設備時,我們必須以塊單位進行操作,將一塊的

數據讀取到內存中去,然后在內存中找到相應的那個字節數據修改之后再以一塊的數據寫入到我們的塊設備中去。

(3)網絡設備,網絡設備是專為網卡設計的驅動模型,linux中網絡設備驅動主要目的是為了支持API中socket相關的那些函數工作。

3、為什么字符設備驅動最重要

(1)常見大量設備都屬於字符設備

(2)舉例說明非標准類型字符設備驅動

 

五、驅動程序的安全性要求

1、驅動是內核的一部分

(1)驅動已經成為內核中最龐大的組成部分

(2)內核會直接以函數調用的方式調用驅動代碼

(3)驅動的動態安裝和卸載都會“更改”內核

2、驅動對內核的影響

(1)驅動程序崩潰甚至會導致內核崩潰

(2)驅動的效率會影響內核的整體效率

(3)驅動的漏洞會造成內核安全漏洞

3、常見驅動安全性問題

(1)未初始化指針

(2)惡意用戶程序

(3)緩沖區溢出

(4)競爭狀態

 

參考:  《朱友鵬嵌入式Linux開發\5.Linux驅動開發\5.1.驅動應該怎么學》

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM