國(guó)外工會(huì)網(wǎng)站建設(shè)培訓(xùn)網(wǎng)站有哪些
Linux驅(qū)動(dòng)開(kāi)發(fā)詳細(xì)解析
驅(qū)動(dòng)概念
驅(qū)動(dòng)與底層硬件直接打交道,充當(dāng)了硬件與應(yīng)用軟件中間的橋梁。
- 具體任務(wù)
- 讀寫(xiě)設(shè)備寄存器(實(shí)現(xiàn)控制的方式)
- 完成設(shè)備的輪詢、中斷處理、DMA通信(CPU與外設(shè)通信的方式)
- 進(jìn)行物理內(nèi)存向虛擬內(nèi)存的映射(在開(kāi)啟硬件MMU的情況下)
Linux系統(tǒng)主要部分:內(nèi)核、shell、文件系統(tǒng)、應(yīng)用程序
- 內(nèi)核、shell和文件系統(tǒng)一起形成了基本的操作系統(tǒng)結(jié)構(gòu),它們使得用戶可以運(yùn)行程序、管理文件并使用系統(tǒng)
- 分層設(shè)計(jì)的思想讓程序間松耦合,有助于適配各種平臺(tái)
- 驅(qū)動(dòng)的上面是系統(tǒng)調(diào)用,下面是硬件
驅(qū)動(dòng)分類(lèi)
Linux驅(qū)動(dòng)分為三個(gè)基礎(chǔ)大類(lèi):字符設(shè)備驅(qū)動(dòng),塊設(shè)備驅(qū)動(dòng),網(wǎng)絡(luò)設(shè)備驅(qū)動(dòng)。
- 字符設(shè)備(Char Device)
- 字符(char)設(shè)備是個(gè)能夠像字節(jié)流(類(lèi)似文件)一樣被訪問(wèn)的設(shè)備。
- 對(duì)字符設(shè)備發(fā)出讀/寫(xiě)請(qǐng)求時(shí),實(shí)際的硬件I/O操作一般緊接著發(fā)生。
- 字符設(shè)備驅(qū)動(dòng)程序通常至少要實(shí)現(xiàn)open、close、read和write系統(tǒng)調(diào)用。
- 比如我們常見(jiàn)的lcd、觸摸屏、鍵盤(pán)、led、串口等等,他們一般對(duì)應(yīng)具體的硬件都是進(jìn)行出具的采集、處理、傳輸。
- 塊設(shè)備(Block Device)
- 一個(gè)塊設(shè)備驅(qū)動(dòng)程序主要通過(guò)傳輸固定大小的數(shù)據(jù)(一般為512或1k)來(lái)訪問(wèn)設(shè)備。
- 塊設(shè)備通過(guò)buffer cache(內(nèi)存緩沖區(qū))訪問(wèn),可以隨機(jī)存取,即:任何塊都可以讀寫(xiě),不必考慮它在設(shè)備的什么地方。
- 塊設(shè)備可以通過(guò)它們的設(shè)備特殊文件訪問(wèn),但是更常見(jiàn)的是通過(guò)文件系統(tǒng)進(jìn)行訪問(wèn)。
- 只有一個(gè)塊設(shè)備可以支持一個(gè)安裝的文件系統(tǒng)。
- 比如我們常見(jiàn)的電腦硬盤(pán)、SD卡、U盤(pán)、光盤(pán)等。
- 網(wǎng)絡(luò)設(shè)備(Net Device)
- 任何網(wǎng)絡(luò)事務(wù)都經(jīng)過(guò)一個(gè)網(wǎng)絡(luò)接口形成,即一個(gè)能夠和其他主機(jī)交換數(shù)據(jù)的設(shè)備。
- 訪問(wèn)網(wǎng)絡(luò)接口的方法仍然是給它們分配一個(gè)唯一的名字(比如eth0),但這個(gè)名字在文件系統(tǒng)中不存在對(duì)應(yīng)的節(jié)點(diǎn)。
- 內(nèi)核和網(wǎng)絡(luò)設(shè)備驅(qū)動(dòng)程序間的通信,完全不同于內(nèi)核和字符以及塊驅(qū)動(dòng)程序之間的通信,內(nèi)核調(diào)用一套和數(shù)據(jù)包傳輸相關(guān)的函(socket函數(shù))而不是read、write等。
- 比如我們常見(jiàn)的網(wǎng)卡設(shè)備、藍(lán)牙設(shè)備。
驅(qū)動(dòng)程序的功能
- 對(duì)設(shè)備初始化和釋放
- 把數(shù)據(jù)從內(nèi)核傳送到硬件和從硬件讀取數(shù)據(jù)
- 讀取應(yīng)用程序傳送給設(shè)備文件的數(shù)據(jù)和回送應(yīng)用程序請(qǐng)求的數(shù)據(jù)
- 檢測(cè)和處理設(shè)備出現(xiàn)的錯(cuò)誤