第4章 嵌入式Linux接口設(shè)計(jì)與驅(qū)動(dòng)程序-部分1_第1頁(yè)
第4章 嵌入式Linux接口設(shè)計(jì)與驅(qū)動(dòng)程序-部分1_第2頁(yè)
第4章 嵌入式Linux接口設(shè)計(jì)與驅(qū)動(dòng)程序-部分1_第3頁(yè)
第4章 嵌入式Linux接口設(shè)計(jì)與驅(qū)動(dòng)程序-部分1_第4頁(yè)
第4章 嵌入式Linux接口設(shè)計(jì)與驅(qū)動(dòng)程序-部分1_第5頁(yè)
已閱讀5頁(yè),還剩44頁(yè)未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡(jiǎn)介

1、 第第4 4章章 嵌入式嵌入式LinuxLinux接口設(shè)計(jì)與驅(qū)動(dòng)開發(fā)接口設(shè)計(jì)與驅(qū)動(dòng)開發(fā)(第(第1 1部分部分 DEVFSDEVFS) 理解設(shè)備驅(qū)動(dòng)程序的概念、分類、處理器與理解設(shè)備驅(qū)動(dòng)程序的概念、分類、處理器與設(shè)備間數(shù)據(jù)交換方法設(shè)備間數(shù)據(jù)交換方法 熟悉驅(qū)動(dòng)程序結(jié)構(gòu)熟悉驅(qū)動(dòng)程序結(jié)構(gòu) 熟悉驅(qū)動(dòng)程序開發(fā)方法熟悉驅(qū)動(dòng)程序開發(fā)方法 4.1.1 設(shè)備驅(qū)動(dòng)程序概述設(shè)備驅(qū)動(dòng)程序概述 1. 驅(qū)動(dòng)程序定義及功能驅(qū)動(dòng)程序定義及功能 設(shè)備驅(qū)動(dòng)程序?qū)嶋H是處理和操作硬件控制器設(shè)備驅(qū)動(dòng)程序?qū)嶋H是處理和操作硬件控制器的軟件,從本質(zhì)上講,是內(nèi)核中具有最高特權(quán)的軟件,從本質(zhì)上講,是內(nèi)核中具有最高特權(quán)級(jí)的、駐留內(nèi)存的、可共享的底層

2、硬件處理例級(jí)的、駐留內(nèi)存的、可共享的底層硬件處理例程。驅(qū)動(dòng)程序是內(nèi)核的一部分,是操作系統(tǒng)內(nèi)程。驅(qū)動(dòng)程序是內(nèi)核的一部分,是操作系統(tǒng)內(nèi)核與硬件設(shè)備的直接接口,驅(qū)動(dòng)程序屏蔽了硬核與硬件設(shè)備的直接接口,驅(qū)動(dòng)程序屏蔽了硬件的細(xì)節(jié)件的細(xì)節(jié). 4.1 4.1 設(shè)備驅(qū)動(dòng)程序基礎(chǔ)設(shè)備驅(qū)動(dòng)程序基礎(chǔ) 完成以下功能:完成以下功能:(1) 對(duì)設(shè)備初始化和釋放;對(duì)設(shè)備初始化和釋放;(2) 對(duì)設(shè)備進(jìn)行管理,包括實(shí)時(shí)參數(shù)設(shè)置,對(duì)設(shè)備進(jìn)行管理,包括實(shí)時(shí)參數(shù)設(shè)置,以及提供對(duì)設(shè)備的操作接口;以及提供對(duì)設(shè)備的操作接口;(3) 讀取應(yīng)用程序傳送給設(shè)備文件的數(shù)據(jù)或讀取應(yīng)用程序傳送給設(shè)備文件的數(shù)據(jù)或者回送應(yīng)用程序請(qǐng)求的數(shù)據(jù);者回送應(yīng)用程序

3、請(qǐng)求的數(shù)據(jù);(4) 檢測(cè)和處理設(shè)備出現(xiàn)的錯(cuò)誤。檢測(cè)和處理設(shè)備出現(xiàn)的錯(cuò)誤。 簡(jiǎn)單來(lái)說(shuō)可以概括為:管理簡(jiǎn)單來(lái)說(shuō)可以概括為:管理I/O設(shè)備設(shè)備,上上層軟件的抽象操作與設(shè)備操作的轉(zhuǎn)換。層軟件的抽象操作與設(shè)備操作的轉(zhuǎn)換。2. 設(shè)備驅(qū)動(dòng)程序的概念設(shè)備驅(qū)動(dòng)程序的概念 Linux操作系統(tǒng)將所有的設(shè)備全部看成文操作系統(tǒng)將所有的設(shè)備全部看成文件,并通過(guò)文件的操作界面進(jìn)行操作。對(duì)用戶件,并通過(guò)文件的操作界面進(jìn)行操作。對(duì)用戶程序而言,設(shè)備驅(qū)動(dòng)程序隱藏了設(shè)備的具體細(xì)程序而言,設(shè)備驅(qū)動(dòng)程序隱藏了設(shè)備的具體細(xì)節(jié),對(duì)各種不同設(shè)備提供了一致的接口,一般節(jié),對(duì)各種不同設(shè)備提供了一致的接口,一般來(lái)說(shuō),是把設(shè)備映射為一個(gè)特殊的設(shè)備文

4、件,來(lái)說(shuō),是把設(shè)備映射為一個(gè)特殊的設(shè)備文件,用戶程序可以像對(duì)其他文件一樣對(duì)此設(shè)備文件用戶程序可以像對(duì)其他文件一樣對(duì)此設(shè)備文件進(jìn)行操作。進(jìn)行操作。 由于每一個(gè)設(shè)備至少由文件系統(tǒng)的一個(gè)文由于每一個(gè)設(shè)備至少由文件系統(tǒng)的一個(gè)文件代表,因而都有一個(gè)件代表,因而都有一個(gè)“文件名文件名”。 應(yīng)用程序通??梢酝ㄟ^(guò)系統(tǒng)調(diào)用應(yīng)用程序通常可以通過(guò)系統(tǒng)調(diào)用open()打開打開設(shè)備文件,建立起與目標(biāo)設(shè)備的連接。設(shè)備文件,建立起與目標(biāo)設(shè)備的連接。 打開了代表著目標(biāo)設(shè)備的文件,即建立起與打開了代表著目標(biāo)設(shè)備的文件,即建立起與設(shè)備的連接后,可以通過(guò)設(shè)備的連接后,可以通過(guò)read()、write()、ioctl()等常規(guī)的文件

5、操作對(duì)目標(biāo)設(shè)備進(jìn)行操作。等常規(guī)的文件操作對(duì)目標(biāo)設(shè)備進(jìn)行操作。 設(shè)備文件的屬性由三部分信息組成:設(shè)備文件的屬性由三部分信息組成: 第一部分是文件的類型第一部分是文件的類型 第二部分是一個(gè)主設(shè)備號(hào)第二部分是一個(gè)主設(shè)備號(hào) 第三部分是一個(gè)次設(shè)備號(hào)。第三部分是一個(gè)次設(shè)備號(hào)。 其中類型和主設(shè)備號(hào)結(jié)合在一起惟一地確定了其中類型和主設(shè)備號(hào)結(jié)合在一起惟一地確定了設(shè)備文件驅(qū)動(dòng)程序及其界面,而次設(shè)備號(hào)則說(shuō)明設(shè)備文件驅(qū)動(dòng)程序及其界面,而次設(shè)備號(hào)則說(shuō)明目標(biāo)設(shè)備是同類設(shè)備中的第幾個(gè)。目標(biāo)設(shè)備是同類設(shè)備中的第幾個(gè)。 由于由于Linux 中將設(shè)備當(dāng)做文件處理,所以中將設(shè)備當(dāng)做文件處理,所以對(duì)設(shè)備進(jìn)行操作的調(diào)用格式與對(duì)文件的操

6、作對(duì)設(shè)備進(jìn)行操作的調(diào)用格式與對(duì)文件的操作類似,主要包括類似,主要包括open()、read()、write()、ioctl()、close()等。應(yīng)用程序發(fā)出系統(tǒng)調(diào)用等。應(yīng)用程序發(fā)出系統(tǒng)調(diào)用命令后,會(huì)從用戶態(tài)轉(zhuǎn)到核心態(tài),通過(guò)內(nèi)核命令后,會(huì)從用戶態(tài)轉(zhuǎn)到核心態(tài),通過(guò)內(nèi)核將將open()這樣的系統(tǒng)調(diào)用轉(zhuǎn)換成對(duì)物理設(shè)備這樣的系統(tǒng)調(diào)用轉(zhuǎn)換成對(duì)物理設(shè)備的操作。的操作。 3. 驅(qū)動(dòng)層次結(jié)構(gòu)驅(qū)動(dòng)層次結(jié)構(gòu) Linux 下的設(shè)備驅(qū)動(dòng)程序是內(nèi)核的一部分,下的設(shè)備驅(qū)動(dòng)程序是內(nèi)核的一部分,運(yùn)行在內(nèi)核模式,也就是說(shuō)設(shè)備驅(qū)動(dòng)程序?yàn)閮?nèi)運(yùn)行在內(nèi)核模式,也就是說(shuō)設(shè)備驅(qū)動(dòng)程序?yàn)閮?nèi)核提供了一個(gè)核提供了一個(gè) I/O 接口,用戶使用這個(gè)

7、接口實(shí)接口,用戶使用這個(gè)接口實(shí)現(xiàn)對(duì)設(shè)備的操作?,F(xiàn)對(duì)設(shè)備的操作。 下圖所示,顯示了典型的下圖所示,顯示了典型的Linux 輸入輸入/輸出輸出系統(tǒng)中各層次結(jié)構(gòu)和功能。系統(tǒng)中各層次結(jié)構(gòu)和功能。 Linux 設(shè)備驅(qū)動(dòng)程序包含中斷處理程序和設(shè)設(shè)備驅(qū)動(dòng)程序包含中斷處理程序和設(shè)備服務(wù)子程序兩部分。備服務(wù)子程序兩部分。 設(shè)備服務(wù)子程序包含了所有與設(shè)備操作相關(guān)設(shè)備服務(wù)子程序包含了所有與設(shè)備操作相關(guān)的處理代碼。它從面向用戶進(jìn)程的設(shè)備文件系統(tǒng)的處理代碼。它從面向用戶進(jìn)程的設(shè)備文件系統(tǒng)中接受用戶命令,并對(duì)設(shè)備控制器執(zhí)行操作。這中接受用戶命令,并對(duì)設(shè)備控制器執(zhí)行操作。這樣,設(shè)備驅(qū)動(dòng)程序屏蔽了設(shè)備的特殊性,使用戶樣,設(shè)備

8、驅(qū)動(dòng)程序屏蔽了設(shè)備的特殊性,使用戶可以像對(duì)待文件一樣操作設(shè)備??梢韵駥?duì)待文件一樣操作設(shè)備。 設(shè)備控制器需要獲得系統(tǒng)服務(wù)時(shí)有兩種方設(shè)備控制器需要獲得系統(tǒng)服務(wù)時(shí)有兩種方式:式: 查詢查詢 中斷中斷 因?yàn)橐驗(yàn)?Linux 下的設(shè)備驅(qū)動(dòng)程序是內(nèi)核的一下的設(shè)備驅(qū)動(dòng)程序是內(nèi)核的一部分,在設(shè)備查詢期間系統(tǒng)不能運(yùn)行其他代碼部分,在設(shè)備查詢期間系統(tǒng)不能運(yùn)行其他代碼,查詢方式的工作效率比較低,所以只有少數(shù)設(shè)查詢方式的工作效率比較低,所以只有少數(shù)設(shè)備如軟盤驅(qū)動(dòng)程序采取這種方式,大多設(shè)備以備如軟盤驅(qū)動(dòng)程序采取這種方式,大多設(shè)備以中斷方式向設(shè)備驅(qū)動(dòng)程序發(fā)出輸入中斷方式向設(shè)備驅(qū)動(dòng)程序發(fā)出輸入/輸出請(qǐng)求。輸出請(qǐng)求。4. 設(shè)

9、備驅(qū)動(dòng)程序與外界的接口設(shè)備驅(qū)動(dòng)程序與外界的接口 每種類型的驅(qū)動(dòng)程序,不管是字符設(shè)備還是每種類型的驅(qū)動(dòng)程序,不管是字符設(shè)備還是塊設(shè)備都為內(nèi)核提供相同的調(diào)用接口,因此內(nèi)核塊設(shè)備都為內(nèi)核提供相同的調(diào)用接口,因此內(nèi)核能以相同的方式處理不同的設(shè)備。能以相同的方式處理不同的設(shè)備。Linux 為每種為每種不同類型的設(shè)備驅(qū)動(dòng)程序維護(hù)相應(yīng)的數(shù)據(jù)結(jié)構(gòu),不同類型的設(shè)備驅(qū)動(dòng)程序維護(hù)相應(yīng)的數(shù)據(jù)結(jié)構(gòu),以便定義統(tǒng)一的接口并實(shí)現(xiàn)驅(qū)動(dòng)程序的可裝載性以便定義統(tǒng)一的接口并實(shí)現(xiàn)驅(qū)動(dòng)程序的可裝載性和動(dòng)態(tài)性。和動(dòng)態(tài)性。Linux 設(shè)備驅(qū)動(dòng)程序與外界的接口可設(shè)備驅(qū)動(dòng)程序與外界的接口可以分為如下三個(gè)部分。以分為如下三個(gè)部分。 驅(qū)動(dòng)程序與操作

10、系統(tǒng)內(nèi)核的接口:驅(qū)動(dòng)程序與操作系統(tǒng)內(nèi)核的接口: 這是通過(guò)數(shù)據(jù)結(jié)構(gòu)這是通過(guò)數(shù)據(jù)結(jié)構(gòu) file_operations來(lái)完成的。來(lái)完成的。 驅(qū)動(dòng)程序與系統(tǒng)引導(dǎo)的接口:驅(qū)動(dòng)程序與系統(tǒng)引導(dǎo)的接口: 這部分利用驅(qū)動(dòng)程序?qū)υO(shè)備進(jìn)行初始化。這部分利用驅(qū)動(dòng)程序?qū)υO(shè)備進(jìn)行初始化。 驅(qū)動(dòng)程序與設(shè)備的接口:驅(qū)動(dòng)程序與設(shè)備的接口: 這部分描述了驅(qū)動(dòng)程序如何與設(shè)備進(jìn)行交互,這部分描述了驅(qū)動(dòng)程序如何與設(shè)備進(jìn)行交互,這與具體設(shè)備密切相關(guān)。這與具體設(shè)備密切相關(guān)。 它們之間的相互關(guān)系如下圖所示。它們之間的相互關(guān)系如下圖所示。 5.設(shè)備驅(qū)動(dòng)程序的特點(diǎn)設(shè)備驅(qū)動(dòng)程序的特點(diǎn) 綜上所述,綜上所述,Linux 中的設(shè)備驅(qū)動(dòng)程序有如下特中的設(shè)

11、備驅(qū)動(dòng)程序有如下特點(diǎn)。點(diǎn)。 (1)內(nèi)核代碼:)內(nèi)核代碼:設(shè)備驅(qū)動(dòng)程序是內(nèi)核的一部設(shè)備驅(qū)動(dòng)程序是內(nèi)核的一部分,如果驅(qū)動(dòng)程序出錯(cuò),則可能導(dǎo)致系統(tǒng)崩潰。分,如果驅(qū)動(dòng)程序出錯(cuò),則可能導(dǎo)致系統(tǒng)崩潰。 (2)內(nèi)核接口:)內(nèi)核接口:設(shè)備驅(qū)動(dòng)程序必須為內(nèi)核或設(shè)備驅(qū)動(dòng)程序必須為內(nèi)核或者其子系統(tǒng)者其子系統(tǒng)提供一個(gè)標(biāo)準(zhǔn)接口提供一個(gè)標(biāo)準(zhǔn)接口。比如,一個(gè)終端。比如,一個(gè)終端驅(qū)動(dòng)程序必須為內(nèi)核提供一個(gè)文件驅(qū)動(dòng)程序必須為內(nèi)核提供一個(gè)文件 I/O 接口;一接口;一個(gè)個(gè) SCSI設(shè)備驅(qū)動(dòng)程序應(yīng)該為設(shè)備驅(qū)動(dòng)程序應(yīng)該為 SCSI子系統(tǒng)提供子系統(tǒng)提供一個(gè)一個(gè)SCSI設(shè)備接口,同時(shí)設(shè)備接口,同時(shí)SCSI子系統(tǒng)也必須為子系統(tǒng)也必須為內(nèi)核

12、提供文件的內(nèi)核提供文件的 I/O 接口及緩沖區(qū)。接口及緩沖區(qū)。 (3)內(nèi)核機(jī)制和服務(wù):)內(nèi)核機(jī)制和服務(wù):設(shè)備驅(qū)動(dòng)程序使用一設(shè)備驅(qū)動(dòng)程序使用一些標(biāo)準(zhǔn)的內(nèi)核服務(wù),如內(nèi)存分配等。些標(biāo)準(zhǔn)的內(nèi)核服務(wù),如內(nèi)存分配等。 (4)可裝載:)可裝載:大多數(shù)的大多數(shù)的 Linux 操作系統(tǒng)設(shè)備操作系統(tǒng)設(shè)備驅(qū)動(dòng)程序都可以在需要時(shí)裝載進(jìn)內(nèi)核,在不需驅(qū)動(dòng)程序都可以在需要時(shí)裝載進(jìn)內(nèi)核,在不需要時(shí)從內(nèi)核中卸載。要時(shí)從內(nèi)核中卸載。 (5)可設(shè)置:)可設(shè)置:Linux 操作系統(tǒng)設(shè)備驅(qū)動(dòng)程序操作系統(tǒng)設(shè)備驅(qū)動(dòng)程序可以集成為內(nèi)核的一部分,并可以根據(jù)需要把可以集成為內(nèi)核的一部分,并可以根據(jù)需要把其中的某一部分集成到內(nèi)核中,這只需要在系其

13、中的某一部分集成到內(nèi)核中,這只需要在系統(tǒng)編譯時(shí)進(jìn)行相應(yīng)的設(shè)置即可。統(tǒng)編譯時(shí)進(jìn)行相應(yīng)的設(shè)置即可。 (6)動(dòng)態(tài)性:)動(dòng)態(tài)性:在系統(tǒng)啟動(dòng)且各個(gè)設(shè)備驅(qū)動(dòng)程在系統(tǒng)啟動(dòng)且各個(gè)設(shè)備驅(qū)動(dòng)程序初始化后,驅(qū)動(dòng)程序?qū)⒕S護(hù)其控制的設(shè)備。序初始化后,驅(qū)動(dòng)程序?qū)⒕S護(hù)其控制的設(shè)備。如果該設(shè)備驅(qū)動(dòng)程序控制的設(shè)備不存在,也不如果該設(shè)備驅(qū)動(dòng)程序控制的設(shè)備不存在,也不影響系統(tǒng)的運(yùn)行,只是多占用一點(diǎn)系統(tǒng)內(nèi)存。影響系統(tǒng)的運(yùn)行,只是多占用一點(diǎn)系統(tǒng)內(nèi)存。 每個(gè)可以增加到內(nèi)核中的代碼稱為一個(gè)每個(gè)可以增加到內(nèi)核中的代碼稱為一個(gè)模塊模塊。Linux內(nèi)核支持相當(dāng)多的模塊的類型(或內(nèi)核支持相當(dāng)多的模塊的類型(或“類類”),),但不僅僅只局限于設(shè)備驅(qū)

14、動(dòng)程序。每個(gè)模塊由目但不僅僅只局限于設(shè)備驅(qū)動(dòng)程序。每個(gè)模塊由目標(biāo)代碼組成(沒(méi)有連接成完整的可執(zhí)行文件),標(biāo)代碼組成(沒(méi)有連接成完整的可執(zhí)行文件),通過(guò)通過(guò)insmod程序它們可以動(dòng)態(tài)連接到運(yùn)行著的內(nèi)程序它們可以動(dòng)態(tài)連接到運(yùn)行著的內(nèi)核中,而通過(guò)核中,而通過(guò)rmmod程序就可以去除這些模塊。程序就可以去除這些模塊。4.1.2 設(shè)備驅(qū)動(dòng)程序的分類設(shè)備驅(qū)動(dòng)程序的分類1. 分類分類 Linux將設(shè)備分成如下類型:將設(shè)備分成如下類型: 一類是一類是塊設(shè)備塊設(shè)備,類似磁盤以記錄塊或扇區(qū)為,類似磁盤以記錄塊或扇區(qū)為單位,成塊進(jìn)行輸入單位,成塊進(jìn)行輸入/輸出的設(shè)備;輸出的設(shè)備; 另一類是另一類是字符設(shè)備字符設(shè)備

15、,類似鍵盤以字符為單位,類似鍵盤以字符為單位,逐個(gè)進(jìn)行輸入逐個(gè)進(jìn)行輸入/輸出的設(shè)備。輸出的設(shè)備。 網(wǎng)絡(luò)設(shè)備網(wǎng)絡(luò)設(shè)備是介于塊設(shè)備和字符設(shè)備之間的一是介于塊設(shè)備和字符設(shè)備之間的一種特殊設(shè)備。種特殊設(shè)備。 1)字符設(shè)備)字符設(shè)備 字符設(shè)備以字節(jié)為單位逐個(gè)進(jìn)行字符設(shè)備以字節(jié)為單位逐個(gè)進(jìn)行I/O操作,字符設(shè)操作,字符設(shè)備中的緩存是可有可無(wú),它不支持隨機(jī)訪問(wèn)。備中的緩存是可有可無(wú),它不支持隨機(jī)訪問(wèn)。 如:如:串口設(shè)備串口設(shè)備/dev/cua0和和/dev/cua1。 ls -l /dev/ttyS0 crw-rw-rw- 1 root uucp 4, 64 4月月 1 19:56 /dev/ttyS02)

16、塊設(shè)備)塊設(shè)備 塊設(shè)備的存取是通過(guò)塊設(shè)備的存取是通過(guò)buffer、cache來(lái)進(jìn)行,來(lái)進(jìn)行, 可以進(jìn)行隨機(jī)訪問(wèn)可以進(jìn)行隨機(jī)訪問(wèn). 例如:例如:IDE硬盤設(shè)備硬盤設(shè)備/dev/hda ,可以支持可,可以支持可安裝文件系統(tǒng)。安裝文件系統(tǒng)。 ls -l /dev/mtdblock3 brw-r-r- 1 505 505 31, 3 Feb 19 2005 /dev/mtdblock33)網(wǎng)絡(luò)設(shè)備)網(wǎng)絡(luò)設(shè)備 網(wǎng)絡(luò)設(shè)備是一類比較特別的設(shè)備,它不網(wǎng)絡(luò)設(shè)備是一類比較特別的設(shè)備,它不像字符或塊設(shè)備那樣通過(guò)對(duì)應(yīng)的設(shè)備文件節(jié)像字符或塊設(shè)備那樣通過(guò)對(duì)應(yīng)的設(shè)備文件節(jié)點(diǎn)訪問(wèn),內(nèi)核也不再通過(guò)點(diǎn)訪問(wèn),內(nèi)核也不再通過(guò)read

17、或或write等調(diào)等調(diào)用去訪問(wèn)網(wǎng)絡(luò)設(shè)備。通過(guò)用去訪問(wèn)網(wǎng)絡(luò)設(shè)備。通過(guò)BSD套接口訪問(wèn)。套接口訪問(wèn)。2.設(shè)備文件與設(shè)備號(hào)設(shè)備文件與設(shè)備號(hào) 用戶通過(guò)設(shè)備文件訪問(wèn)設(shè)備,每個(gè)設(shè)備用一用戶通過(guò)設(shè)備文件訪問(wèn)設(shè)備,每個(gè)設(shè)備用一個(gè)主設(shè)備號(hào)和次設(shè)備號(hào)標(biāo)。塊設(shè)備接口僅支持面?zhèn)€主設(shè)備號(hào)和次設(shè)備號(hào)標(biāo)。塊設(shè)備接口僅支持面向塊的向塊的I/O操作,所有操作,所有I/O操作都通過(guò)在內(nèi)核地址操作都通過(guò)在內(nèi)核地址空間中的空間中的I/O緩沖區(qū)進(jìn)行,它可以支持隨機(jī)存取緩沖區(qū)進(jìn)行,它可以支持隨機(jī)存取的功能。的功能。 文件系統(tǒng)通常都建立在塊設(shè)備上。文件系統(tǒng)通常都建立在塊設(shè)備上。 主設(shè)備號(hào)主設(shè)備號(hào)表示設(shè)備對(duì)應(yīng)的驅(qū)動(dòng)程序;表示設(shè)備對(duì)應(yīng)的驅(qū)動(dòng)程

18、序; 次設(shè)備號(hào)次設(shè)備號(hào)由內(nèi)核使用,用于正確確定設(shè)備文件所指由內(nèi)核使用,用于正確確定設(shè)備文件所指的設(shè)備。的設(shè)備。 內(nèi)核用內(nèi)核用dev_t類型(類型()來(lái)保存設(shè))來(lái)保存設(shè)備編號(hào),備編號(hào),dev_t是一個(gè)是一個(gè)32位的數(shù),位的數(shù),12位表示主設(shè)備位表示主設(shè)備號(hào),號(hào),20為表示次設(shè)備號(hào)。為表示次設(shè)備號(hào)。 在實(shí)際使用中,是通過(guò)在實(shí)際使用中,是通過(guò)中定義中定義的宏來(lái)轉(zhuǎn)換格式。的宏來(lái)轉(zhuǎn)換格式。 4.1.3 處理器與設(shè)備間數(shù)據(jù)交換處理器與設(shè)備間數(shù)據(jù)交換 處理器與外設(shè)之間傳輸數(shù)據(jù)的控制方式通常有處理器與外設(shè)之間傳輸數(shù)據(jù)的控制方式通常有3種:查詢方式、中斷方式和直接內(nèi)存存取(種:查詢方式、中斷方式和直接內(nèi)存存?。?/p>

19、DMA)方式。方式。 1查詢方式查詢方式 設(shè)備驅(qū)動(dòng)程序通過(guò)設(shè)備的設(shè)備驅(qū)動(dòng)程序通過(guò)設(shè)備的I/O端口空間,以端口空間,以及存儲(chǔ)器空間完成數(shù)據(jù)的交換。及存儲(chǔ)器空間完成數(shù)據(jù)的交換。 利用這些地址空間,驅(qū)動(dòng)程序可以向外設(shè)發(fā)利用這些地址空間,驅(qū)動(dòng)程序可以向外設(shè)發(fā)送指定的操作指令。送指定的操作指令。 通常來(lái)講,由于外設(shè)的操作耗時(shí)較長(zhǎng),因通常來(lái)講,由于外設(shè)的操作耗時(shí)較長(zhǎng),因此,當(dāng)處理器實(shí)際執(zhí)行了操作指令之后,驅(qū)動(dòng)此,當(dāng)處理器實(shí)際執(zhí)行了操作指令之后,驅(qū)動(dòng)程序可采用查詢方式等待外設(shè)完成操作。程序可采用查詢方式等待外設(shè)完成操作。 驅(qū)動(dòng)程序在提交命令之后,開始查詢?cè)O(shè)備的狀驅(qū)動(dòng)程序在提交命令之后,開始查詢?cè)O(shè)備的狀態(tài)寄存

20、器,當(dāng)狀態(tài)寄存器表明操作完成時(shí),驅(qū)動(dòng)程態(tài)寄存器,當(dāng)狀態(tài)寄存器表明操作完成時(shí),驅(qū)動(dòng)程序可繼續(xù)后續(xù)處理。序可繼續(xù)后續(xù)處理。 查詢方式的優(yōu)點(diǎn)是硬件開銷小,使用起來(lái)比較查詢方式的優(yōu)點(diǎn)是硬件開銷小,使用起來(lái)比較簡(jiǎn)單。簡(jiǎn)單。 在此方式下,在此方式下,CPU要不斷地查詢外設(shè)的狀態(tài),要不斷地查詢外設(shè)的狀態(tài),當(dāng)外設(shè)未準(zhǔn)備好時(shí),就只能循環(huán)等待,不能執(zhí)行其當(dāng)外設(shè)未準(zhǔn)備好時(shí),就只能循環(huán)等待,不能執(zhí)行其他程序,這樣就浪費(fèi)了他程序,這樣就浪費(fèi)了CPU的大量時(shí)間,降低了的大量時(shí)間,降低了處理器的利用率。處理器的利用率。 2中斷方式中斷方式 查詢方式白白浪費(fèi)了大量的處理器時(shí)間,而查詢方式白白浪費(fèi)了大量的處理器時(shí)間,而中斷方式

21、才是多任務(wù)操作系統(tǒng)中最有效利用處理中斷方式才是多任務(wù)操作系統(tǒng)中最有效利用處理器的方式。當(dāng)器的方式。當(dāng)CPU進(jìn)行主程序操作時(shí),外設(shè)的數(shù)進(jìn)行主程序操作時(shí),外設(shè)的數(shù)據(jù)已存入端口的數(shù)據(jù)輸入寄存器,或端口的數(shù)據(jù)據(jù)已存入端口的數(shù)據(jù)輸入寄存器,或端口的數(shù)據(jù)輸出寄存器已空,此時(shí)由外設(shè)通過(guò)接口電路向輸出寄存器已空,此時(shí)由外設(shè)通過(guò)接口電路向CPU發(fā)出中斷請(qǐng)求信號(hào)。發(fā)出中斷請(qǐng)求信號(hào)。 CPU在滿足一定條件下,暫停執(zhí)行當(dāng)前正在在滿足一定條件下,暫停執(zhí)行當(dāng)前正在執(zhí)行的主程序,轉(zhuǎn)入執(zhí)行相應(yīng)能夠進(jìn)行輸入執(zhí)行的主程序,轉(zhuǎn)入執(zhí)行相應(yīng)能夠進(jìn)行輸入/輸出輸出操作的子程序,待輸入操作的子程序,待輸入/輸出操作執(zhí)行完畢之后,輸出操作執(zhí)

22、行完畢之后,CPU再返回并繼續(xù)執(zhí)行原來(lái)被中斷的主程序。再返回并繼續(xù)執(zhí)行原來(lái)被中斷的主程序。 系統(tǒng)引入中斷機(jī)制后,系統(tǒng)引入中斷機(jī)制后,CPU與外設(shè)處于與外設(shè)處于“并行并行”工作狀態(tài),便于實(shí)現(xiàn)信息的實(shí)時(shí)處理和系統(tǒng)的故工作狀態(tài),便于實(shí)現(xiàn)信息的實(shí)時(shí)處理和系統(tǒng)的故障處理。障處理。 3直接訪問(wèn)內(nèi)存(直接訪問(wèn)內(nèi)存(DMA)方式)方式 利用中斷,系統(tǒng)和設(shè)備之間可以通過(guò)設(shè)備驅(qū)動(dòng)利用中斷,系統(tǒng)和設(shè)備之間可以通過(guò)設(shè)備驅(qū)動(dòng)程序傳送數(shù)據(jù),但是,當(dāng)傳送的數(shù)據(jù)量很大時(shí),程序傳送數(shù)據(jù),但是,當(dāng)傳送的數(shù)據(jù)量很大時(shí),因?yàn)橹袛嗵幚砩系难舆t,利用中斷方式的效率會(huì)因?yàn)橹袛嗵幚砩系难舆t,利用中斷方式的效率會(huì)大大降低。而直接內(nèi)存訪問(wèn)(大大

23、降低。而直接內(nèi)存訪問(wèn)(DMA)可以解決)可以解決這一問(wèn)題。這一問(wèn)題。 DMA可允許設(shè)備和系統(tǒng)內(nèi)存間在沒(méi)有處理器可允許設(shè)備和系統(tǒng)內(nèi)存間在沒(méi)有處理器參與的情況下傳輸大量數(shù)據(jù)。參與的情況下傳輸大量數(shù)據(jù)。 設(shè)備驅(qū)動(dòng)程序在利用設(shè)備驅(qū)動(dòng)程序在利用DMA之前,需要選擇之前,需要選擇DMA通道并定義相關(guān)寄存器,以及數(shù)據(jù)的傳輸通道并定義相關(guān)寄存器,以及數(shù)據(jù)的傳輸方向,即讀取或?qū)懭?,然后將設(shè)備設(shè)定為利用該方向,即讀取或?qū)懭?,然后將設(shè)備設(shè)定為利用該DMA通道傳輸數(shù)據(jù)。通道傳輸數(shù)據(jù)。 設(shè)備完成設(shè)置之后,可以立即利用該設(shè)備完成設(shè)置之后,可以立即利用該DMA通通道在設(shè)備和系統(tǒng)的內(nèi)存之間傳輸數(shù)據(jù),傳輸完畢道在設(shè)備和系統(tǒng)的內(nèi)

24、存之間傳輸數(shù)據(jù),傳輸完畢后產(chǎn)生中斷以便通知驅(qū)動(dòng)程序進(jìn)行后續(xù)處理。后產(chǎn)生中斷以便通知驅(qū)動(dòng)程序進(jìn)行后續(xù)處理。 在利用在利用DMA進(jìn)行數(shù)據(jù)傳輸?shù)耐瑫r(shí),處理器仍進(jìn)行數(shù)據(jù)傳輸?shù)耐瑫r(shí),處理器仍然可以繼續(xù)執(zhí)行指令。然可以繼續(xù)執(zhí)行指令。4 .驅(qū)動(dòng)程序結(jié)構(gòu)驅(qū)動(dòng)程序結(jié)構(gòu) Linux設(shè)備驅(qū)動(dòng)程序的代碼結(jié)構(gòu)大致可以設(shè)備驅(qū)動(dòng)程序的代碼結(jié)構(gòu)大致可以分為如下幾個(gè)部分:分為如下幾個(gè)部分: 1)驅(qū)動(dòng)程序的注冊(cè)與注銷)驅(qū)動(dòng)程序的注冊(cè)與注銷 2)設(shè)備的打開與釋放)設(shè)備的打開與釋放 3)設(shè)備的讀寫操作)設(shè)備的讀寫操作 4)設(shè)備的控制操作)設(shè)備的控制操作 5)設(shè)備的中斷和輪詢處理。)設(shè)備的中斷和輪詢處理。 1)驅(qū)動(dòng)程序的注冊(cè)與注銷)驅(qū)

25、動(dòng)程序的注冊(cè)與注銷 注冊(cè):注冊(cè):register_chrdev( );/在在fs/devices.c 注銷:注銷:unregister_chrdev( )2)打開、釋放、讀、寫、控制等)打開、釋放、讀、寫、控制等 Linux內(nèi)核將通過(guò)內(nèi)核將通過(guò)file_operations結(jié)構(gòu)訪問(wèn)驅(qū)結(jié)構(gòu)訪問(wèn)驅(qū)動(dòng)程序提供的函數(shù),字符設(shè)備的讀寫直接使用函動(dòng)程序提供的函數(shù),字符設(shè)備的讀寫直接使用函數(shù)數(shù)read( )和和write( ); 塊設(shè)備需要調(diào)用函數(shù)塊設(shè)備需要調(diào)用函數(shù)block_read( )、block_write( ); ioctl( )的用法與具體設(shè)備密切關(guān)聯(lián),因此需的用法與具體設(shè)備密切關(guān)聯(lián),因此需要根

26、據(jù)設(shè)備的實(shí)際情況進(jìn)行具體分析。要根據(jù)設(shè)備的實(shí)際情況進(jìn)行具體分析。 struct file_operations struct module *owner; loff_t (*llseek) (struct file *, loff_t, int); ssize_t (*read) (struct file *, char *, size_t, loff_t *); ssize_t (*write) (struct file *, const char *, size_t, loff_t *); int (*readdir) (struct file *, void *, filldir_t);

27、 unsigned int (*poll) (struct file *, struct poll_table_struct *); int (*ioctl) (struct inode *, struct file *, unsigned int, unsigned long); int (*mmap) (struct file *, struct vm_area_struct *); int (*open) (struct inode *, struct file *); int (*flush) (struct file *); int (*release) (struct inode

28、*, struct file *); int (*fsync) (struct file *, struct dentry *, int datasync); int (*fasync) (int, struct file *, int); int (*lock) (struct file *, int, struct file_lock *); ssize_t (*readv) (struct file *, const struct iovec *, unsigned long, loff_t *); ssize_t (*writev) (struct file *, const stru

29、ct iovec *, unsigned long, loff_t *); ssize_t (*sendpage) (struct file *, struct page *, int, size_t, loff_t *, int); unsigned long (*get_unmapped_area)(struct file *, unsigned long, unsigned long, unsigned long, unsigned long); ; 打開設(shè)備的接口函數(shù)是打開設(shè)備的接口函數(shù)是open,根據(jù)設(shè)備的不同,根據(jù)設(shè)備的不同,open函數(shù)完成的功能也有所不同,但通常情況下在函數(shù)完成

30、的功能也有所不同,但通常情況下在open函數(shù)中要完成如下工作:函數(shù)中要完成如下工作: 1)遞增計(jì)數(shù)器;)遞增計(jì)數(shù)器; 2)檢查特定設(shè)備的特殊情況;)檢查特定設(shè)備的特殊情況; 3) 初始化設(shè)備;初始化設(shè)備; 4) 識(shí)別次設(shè)備號(hào)。識(shí)別次設(shè)備號(hào)。 其中遞增計(jì)數(shù)器是用于設(shè)備計(jì)數(shù)的。由于其中遞增計(jì)數(shù)器是用于設(shè)備計(jì)數(shù)的。由于設(shè)備在使用時(shí)通常會(huì)打開較多次數(shù),也可以設(shè)備在使用時(shí)通常會(huì)打開較多次數(shù),也可以由不同的進(jìn)程所使用,所以若有一進(jìn)程想要由不同的進(jìn)程所使用,所以若有一進(jìn)程想要關(guān)閉該設(shè)備,則必須保證其他設(shè)備沒(méi)有使用關(guān)閉該設(shè)備,則必須保證其他設(shè)備沒(méi)有使用該設(shè)備。因此使用計(jì)數(shù)器就可以很好地完成該設(shè)備。因此使用計(jì)數(shù)

31、器就可以很好地完成這項(xiàng)功能。這項(xiàng)功能。這里,實(shí)現(xiàn)計(jì)數(shù)器操作的是用在這里,實(shí)現(xiàn)計(jì)數(shù)器操作的是用在中定義的中定義的3 個(gè)宏如下。個(gè)宏如下。MOD_INC_USE_COUNT:計(jì)數(shù)器加一。:計(jì)數(shù)器加一。MOD_DEC_USE_COUNT:計(jì)數(shù)器減一。:計(jì)數(shù)器減一。MOD_IN_USE:計(jì)數(shù)器非零時(shí)返回真。:計(jì)數(shù)器非零時(shí)返回真。 另外,當(dāng)有多個(gè)物理設(shè)備時(shí),就需要識(shí)別另外,當(dāng)有多個(gè)物理設(shè)備時(shí),就需要識(shí)別次設(shè)備號(hào)來(lái)對(duì)各個(gè)不同的設(shè)備進(jìn)行不同的操作,次設(shè)備號(hào)來(lái)對(duì)各個(gè)不同的設(shè)備進(jìn)行不同的操作,在有些驅(qū)動(dòng)程序中并不需要用到。在有些驅(qū)動(dòng)程序中并不需要用到。 釋放設(shè)備的接口函數(shù)是釋放設(shè)備的接口函數(shù)是release。要

32、注意釋放設(shè)備。要注意釋放設(shè)備和關(guān)閉設(shè)備是完全不同的。當(dāng)一個(gè)進(jìn)程釋放設(shè)備和關(guān)閉設(shè)備是完全不同的。當(dāng)一個(gè)進(jìn)程釋放設(shè)備時(shí),其他進(jìn)程還能繼續(xù)使用該設(shè)備,只是該進(jìn)程時(shí),其他進(jìn)程還能繼續(xù)使用該設(shè)備,只是該進(jìn)程暫時(shí)停止對(duì)該設(shè)備的使用;而當(dāng)一個(gè)進(jìn)程關(guān)閉設(shè)暫時(shí)停止對(duì)該設(shè)備的使用;而當(dāng)一個(gè)進(jìn)程關(guān)閉設(shè)備時(shí),其他進(jìn)程必須重新打開此設(shè)備才能使用。備時(shí),其他進(jìn)程必須重新打開此設(shè)備才能使用。釋放設(shè)備時(shí)要完成的工作如下:釋放設(shè)備時(shí)要完成的工作如下: 1)遞減計(jì)數(shù)器)遞減計(jì)數(shù)器MOD_DEC_USE_COUNT; 2)在最后一次釋放設(shè)備操作時(shí)關(guān)閉設(shè)備;)在最后一次釋放設(shè)備操作時(shí)關(guān)閉設(shè)備; 3)讀寫設(shè)備)讀寫設(shè)備read()和和write() 讀寫設(shè)備的主

溫馨提示

  • 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。

最新文檔

評(píng)論

0/150

提交評(píng)論