嵌入式30dvd30盤3guide驅(qū)動(dòng)程序設(shè)計(jì)入門_第1頁
嵌入式30dvd30盤3guide驅(qū)動(dòng)程序設(shè)計(jì)入門_第2頁
嵌入式30dvd30盤3guide驅(qū)動(dòng)程序設(shè)計(jì)入門_第3頁
嵌入式30dvd30盤3guide驅(qū)動(dòng)程序設(shè)計(jì)入門_第4頁
嵌入式30dvd30盤3guide驅(qū)動(dòng)程序設(shè)計(jì)入門_第5頁
已閱讀5頁,還剩30頁未讀 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡介

1、Windows驅(qū)動(dòng)程序設(shè)計(jì)入門Windows設(shè)備驅(qū)動(dòng)程序設(shè)計(jì)2Windows的虛擬內(nèi)存管理/ a.cpp#include int main() int a, *pa;pa = &a;printf(%xn, pa); / 輸出1*pa = 18; getchar(); / 使程序暫停住printf(%dn, *pa); / 輸出2return 0;/ b.cpp#include int main() int a, *pa;pa = &a;printf(%xn, pa); / 輸出1*pa = 2008;printf(%dn, *pa); / 輸出2return 0;3Windows的虛擬內(nèi)存管理

2、 Windows的虛擬內(nèi)存管理機(jī)制為應(yīng)用程序和驅(qū)動(dòng) 程序提供了兩種服務(wù):使每個(gè)進(jìn)程都擁有自己獨(dú)立的內(nèi)存地址空間;對于32位Windows而言,每個(gè)任務(wù)可尋址的內(nèi)存地址空間都為0 x00000000 0 xFFFFFFFF(232, 4GB)當(dāng)物理內(nèi)存不夠4GB時(shí),虛擬內(nèi)存管理模塊會(huì)用磁盤空間模擬內(nèi)存空間,并且該模擬過程對程序是透明的。4用戶地址空間與內(nèi)核地址空間 Windows將每個(gè)進(jìn)程的4GB的獨(dú)立地址空間又劃分為用戶地址空間(0 x00000000 0 x7FFFFFFF)和 內(nèi)核地址空間(0 x80000000 0 xFFFFFFFF)兩部分。操作系統(tǒng)內(nèi)核代碼和數(shù)據(jù)存放在內(nèi)核地址空間;每

3、個(gè)進(jìn)程自己私有的代碼和數(shù)據(jù)存放在用戶地址空間雖然Windows的內(nèi)核代碼和數(shù)據(jù)被映射到了每個(gè)進(jìn)程的地址空間中(所有進(jìn)程看到的內(nèi)容是相同的),但在實(shí)際的物理內(nèi)存中,只有內(nèi)核代碼和數(shù)據(jù)的一份拷貝。5用戶地址空間與內(nèi)核地址空間6用戶模式與內(nèi)核模式為了更好地保護(hù)系統(tǒng),Windwos規(guī)定了兩種處理器工作模式:用戶模式和內(nèi)核模式。工作在用戶模式的程序只能使用CPU支持指令集的一個(gè)子集,只能訪問用戶空間中的內(nèi)存,并且不能直接訪問硬件。工作在內(nèi)核模式的程序不受任何限制,可以使用CPU支持的任意指令,可以訪問任意的內(nèi)存空間,可以直接訪問硬件。所有的Windows應(yīng)用程序都工作于用戶模式,Windows內(nèi)核程序都

4、工作于內(nèi)核模式。也可以認(rèn)為:位于用戶空間的代碼都工作于用戶模式,位于內(nèi)核空間的代碼都工作于內(nèi)核模式。應(yīng)用程序只能通過Windows規(guī)定的一些API訪問內(nèi)核模式的代碼和數(shù)據(jù)。7什么是Windows驅(qū)動(dòng)程序?Windows驅(qū)動(dòng)程序是一種位于內(nèi)核地址空間并且 工作于內(nèi)核模式的一種特殊的程序類型(.sys文件)。驅(qū)動(dòng)程序是操作系統(tǒng)信任的一個(gè)內(nèi)核擴(kuò)展模塊。驅(qū)動(dòng)程序和操作系統(tǒng)之間遵循的是容器與插件模型。OS負(fù)責(zé)管理Driver的生命周期;Driver是一種被動(dòng)的軟件模塊。驅(qū)動(dòng)程序類似于DLL程序,它是一個(gè)回調(diào)函數(shù)(子程序)的集合體,這些函數(shù)由OS在適當(dāng)?shù)臅r(shí)候調(diào)用驅(qū)動(dòng)程序也可以通過Windows內(nèi)核API獲

5、得OS的一些服務(wù)。8編驅(qū)動(dòng)程序用什么編程語言?C語言C+語言1的情況下會(huì)用到匯編語言目前還不能用其它高級語言編寫驅(qū)動(dòng)程序。9編驅(qū)動(dòng)程序用什么開發(fā)工具?DDK (Driver Development Kit) (可以到微軟網(wǎng)站 上免費(fèi)下載)Driver Studio(Compuware NuMega公司的產(chǎn)品)DDKWinDriver DDK10DDK中包含什么?與Windows內(nèi)核API函數(shù)相關(guān)的頭文件(如ddk.h, wdm.h等)與Windows內(nèi)核API函數(shù)相關(guān)的導(dǎo)入庫(wdm.lib等)內(nèi)核專用C運(yùn)行時(shí)間庫的頭文件和導(dǎo)入庫關(guān)于驅(qū)動(dòng)程序編程模型和內(nèi)核API函數(shù)的幫助文檔C+編譯器和鏈接器

6、,綜合創(chuàng)建工具內(nèi)核調(diào)試工具、分析工具11驅(qū)動(dòng)程序的入口函數(shù)extern “C” #include “wdm.h” extern CNTSTATUS DriverEntry(IN PDRIVER_OBJECT DriverObject,IN PUNICODE_STRING RegistryPath) return STATUS_SUCCESS;12HelloWorld版的驅(qū)動(dòng)程序extern “C” #include “wdm.h” extern CNTSTATUS DriverEntry(IN PDRIVER_OBJECT DriverObject,IN PUNICODE_STRING Reg

7、istryPath)NTSTATUS status = STATUS_DEVICE_CONFIGURATION_ERROR;KdPrint(Hellow World!);return status;13內(nèi)核模式下我們能調(diào)用哪些函數(shù)?Windows內(nèi)核輸出的內(nèi)核API函數(shù);DDK提供的運(yùn)行時(shí)間庫其它驅(qū)動(dòng)程序提供的服務(wù)14內(nèi)核模式下我們不能調(diào)用哪些函數(shù)?Windows的用戶模式API函數(shù);ISO規(guī)定的C/C+標(biāo)準(zhǔn)函數(shù)庫15DDK中一個(gè)驅(qū)動(dòng)型工程的組成MAKEFILE文件,一般不作改動(dòng)Sources文件:(1) 指示了整個(gè)工程由哪些源程序和資源文件構(gòu)成; (2) 包含了主要的編譯參數(shù),指導(dǎo)編譯器和鏈

8、接器的工作。.cpp文件和.h文件16如何安裝驅(qū)動(dòng)程序?必須編寫一個(gè)安裝指示文件(.inf)指導(dǎo)Windows將驅(qū)動(dòng)程序安裝到指定位置(一般安裝在windowssystem32drivers子目錄下),并在注冊表中進(jìn)行登記。對于即插即用類設(shè)備的驅(qū)動(dòng),操作系統(tǒng)會(huì)自動(dòng)發(fā)現(xiàn)該設(shè)備并調(diào)用“添加新硬件”程序向用戶詢問相應(yīng)的inf文件的位置。對于非即插即用類設(shè)備的驅(qū)動(dòng),用戶必須自己手動(dòng)調(diào)用“添加新硬件”程序,并通過告訴該程序inf文件的位置。17inf文件主要包含了哪些內(nèi)容?設(shè)備類型、設(shè)備型號(hào)、廠商信息、程序版本號(hào)。對操作系統(tǒng)版本和CPU類型的要求源文件(.sys文件)的文件名和所在位置安裝目標(biāo)子目錄在注

9、冊表中添加哪些內(nèi)容硬件配置信息安全配置信息18“即插即用”型外設(shè)從用戶角度看,即插即用外設(shè)具備如下兩種能力:主機(jī)能夠自動(dòng)發(fā)現(xiàn)該外設(shè);主機(jī)能夠自動(dòng)查找并加載相應(yīng)的驅(qū)動(dòng)程序。從專業(yè)角度看,即插即用型外設(shè)還具有如下功能:能夠利用即插即用總線協(xié)議向主機(jī)匯報(bào)自己的 唯一標(biāo)識(shí)信息和I/O資源請求;能夠通過即插即用總線協(xié)議接收主機(jī)的I/O資源分配結(jié)果并對自己的硬件邏輯作出相應(yīng)的調(diào)整。常用的I/O資源包括:I/O地址空間、內(nèi)存空間、中斷號(hào)、DMA通道號(hào)等。19總線與總線驅(qū)動(dòng)可以這樣認(rèn)為,一臺(tái)計(jì)算機(jī)中除了CPU和內(nèi)存之外的其他硬件模塊都可以稱之為外設(shè)。凡是外設(shè)都需要驅(qū)動(dòng)程序。CPU與外設(shè)之間的連接和通信必須通過

10、總線。一條總線即可以鏈接一臺(tái)外設(shè),也可以連接多臺(tái)外設(shè)。以CPU本身的地址總線和數(shù)據(jù)總線為根,計(jì)算機(jī)系統(tǒng)中的各類總線形成一種樹形結(jié)構(gòu)??偩€也被視為外設(shè),也需要驅(qū)動(dòng)程序支持。這類總線型外設(shè)的驅(qū)動(dòng)被稱為總線驅(qū)動(dòng)。CPU本身的總線所對應(yīng)的驅(qū)動(dòng)稱為“根總線驅(qū)動(dòng)”20總線的樹形結(jié)構(gòu)21即插即用總線能夠連接即插即用設(shè)備的總線稱為即插即用總線。每一種即插即用總線都規(guī)定了一套即插即用協(xié)議用于和設(shè)備之間的身份識(shí)別,I/O 資源協(xié)商等。常見的即插即用總線包括:PnP-ISA、PCI、USB、1394、PCMCIA等22即插即用型設(shè)備驅(qū)動(dòng)的加載過程現(xiàn)假設(shè)驅(qū)動(dòng)程序已被正確安裝:某種PnP總線驅(qū)動(dòng)發(fā)現(xiàn)了即插即用設(shè)備的存在

11、:對于熱插拔設(shè)備,則發(fā)現(xiàn)過程發(fā)生于插入設(shè)備的瞬間;如果是非熱插拔設(shè)備,則發(fā)現(xiàn)過程發(fā)生于系統(tǒng)啟動(dòng)時(shí)PnP總線驅(qū)動(dòng)利用即插即用協(xié)議詢問設(shè)備的ID信息設(shè)備的ID信息是一個(gè)能夠唯一標(biāo)識(shí)該設(shè)備的字符串,一般格式為:總線類型&廠商ID&產(chǎn)品ID&設(shè)備ID&版本號(hào)PnP總線驅(qū)動(dòng)將該ID信息上報(bào)給OSOS利用該設(shè)備ID信息查找硬件鍵(注冊表HKLM SYSTEMCurrentControlSetEnum的某個(gè)子目錄)23即插即用型設(shè)備驅(qū)動(dòng)的加載過程OS查找到該設(shè)備的硬件鍵之后,再通過硬件鍵的Service子鍵查到該設(shè)備的服務(wù)鍵(HKLMSYSTEM CurrentControlSetServices的某個(gè)子目

12、錄)通過服務(wù)鍵的ImagePath子鍵的值就可以找到該設(shè)備所對應(yīng)的驅(qū)動(dòng)程序。OS掃描內(nèi)存,看該驅(qū)動(dòng)是否已被加載,如果沒有,則立即加載該驅(qū)動(dòng),并調(diào)用該驅(qū)動(dòng)的“DiverEnry”回調(diào)函數(shù)。加載完畢之后,OS調(diào)用該驅(qū)動(dòng)的“AddDevice”回調(diào)函數(shù)通知驅(qū)動(dòng)程序有新的設(shè)備到來。24即插即用型設(shè)備驅(qū)動(dòng)的加載過程PnP總線驅(qū)動(dòng)利用即插即用協(xié)議詢問設(shè)備的I/O資源請求,并將請求信息上報(bào)給OS;OS根據(jù)目前系統(tǒng)資源使用情況進(jìn)行資源分配,并將分配結(jié)果反饋給總線驅(qū)動(dòng)和該設(shè)備的驅(qū)動(dòng);現(xiàn)在該設(shè)備的硬件和驅(qū)動(dòng)都知道了資源分配結(jié)果就可以正常工作了。25非即插即用型設(shè)備驅(qū)動(dòng)的加載過程非PnP總線驅(qū)動(dòng)在系統(tǒng)啟動(dòng)時(shí)通過掃描

13、注冊表發(fā)現(xiàn)非PnP設(shè)備的存在,并向OS報(bào)告ID信息。(例如根總線驅(qū)動(dòng)通過掃描HKLM SYSTEM CurrentControlSetEnumRoot的各個(gè)子目錄。)后面的加載步驟與即插即用型設(shè)備類似。唯一不同的是非PnP設(shè)備的資源請求直接寫在了注冊表里,總線驅(qū)動(dòng)不再詢問設(shè)備。26遞歸加載根總線驅(qū)動(dòng)負(fù)責(zé)發(fā)現(xiàn)并裝載掛到它上面的二級總線(如PCI、ISA等)的驅(qū)動(dòng)。二級總線的驅(qū)動(dòng)被裝載并正常工作之后負(fù)責(zé)發(fā)現(xiàn)掛在它們上面的外設(shè)以及三級總線的驅(qū)動(dòng),并依次類推。這個(gè)過程稱為遞歸加載過程。27如何卸載驅(qū)動(dòng)程序?在控制面板 系統(tǒng) 硬件設(shè)備管理器中找到該設(shè)備并右擊“卸載”28基于I/O請求包(IRP)的工作方

14、式29驅(qū)動(dòng)的層次結(jié)構(gòu)在Windows系統(tǒng)中,與一個(gè)設(shè)備相關(guān)的驅(qū)動(dòng)程序至少包含兩種:功能驅(qū)動(dòng)和總線驅(qū)動(dòng)。另外一個(gè)設(shè)備還可以包含可選的過濾驅(qū)動(dòng)。Windows為每個(gè)驅(qū)動(dòng)程序都建立一個(gè)數(shù)據(jù)結(jié)構(gòu)Driver Object,用于記錄與該驅(qū)動(dòng)本身相關(guān)的信息每個(gè)驅(qū)動(dòng)程序?yàn)閷儆谧约汗芾淼脑O(shè)備創(chuàng)建一個(gè)數(shù)據(jù)結(jié)構(gòu)Device Object,用于記錄與設(shè)備相關(guān)的信息。功能驅(qū)動(dòng)創(chuàng)建的Device Object叫FDO,過濾驅(qū)動(dòng)創(chuàng)建的叫FiDO,總線驅(qū)動(dòng)創(chuàng)建的叫PDO。FDO、FiDO和PDO串連在一起形成設(shè)備對象棧。30驅(qū)動(dòng)的層次結(jié)構(gòu) 31驅(qū)動(dòng)對象(Driver Object)在操作系統(tǒng)首次裝載一個(gè)驅(qū)動(dòng)程序之后,它會(huì)創(chuàng)

15、建一個(gè)數(shù)據(jù)結(jié)構(gòu)用來記錄該驅(qū)動(dòng),該數(shù)據(jù)結(jié)構(gòu)我們稱為驅(qū)動(dòng)對象(Driver Object)。驅(qū)動(dòng)對象記錄與驅(qū)動(dòng)程序本身相關(guān)的信息,它主要包含了除了DriverEntry之外的其它驅(qū)動(dòng)程序入口函數(shù)的入口地址。(驅(qū)動(dòng)程序是一種具有多個(gè)入口函數(shù)的程序)驅(qū)動(dòng)對象是由操作系統(tǒng)創(chuàng)建,然后作為DriverEntry的第一個(gè)參數(shù)傳遞給你的程序。在獲得驅(qū)動(dòng)對象的指針之后,你的程序需要對其中的一些字段進(jìn)行初始化。32驅(qū)動(dòng)對象(Driver Object)驅(qū)動(dòng)對象在DDK的頭文件(Wdm.h)中按如下方式定義:。typedefstruct_DRIVER_OBJECTCSHORTType;CSHORTSize; DRIV

16、ER_OBJECT,*PDRIVER_OBJECT; 由上面的定義可以看成,驅(qū)動(dòng)對象不同于C+中的Class,它只是一個(gè)Struct。3334驅(qū)動(dòng)對象的一些關(guān)鍵字段(一)DriverStartIo (PDRIVER_STARTIO) : 指向StartIO入口函數(shù)的指針.DriverUnload (PDRIVER_UNLOAD) :指向DriverUnload入口函數(shù)的指針。在驅(qū)動(dòng)程序被從內(nèi)存中卸載時(shí),DriverUnload入口函數(shù)會(huì)被操作系統(tǒng)調(diào)用,你應(yīng)該在該函數(shù)內(nèi)部做一些與DriverEntry向?qū)?yīng)的資源清除工作。MajorFunction (一個(gè)數(shù)組,數(shù)組中每一元素又是一個(gè)指向函數(shù)的指針 PDRIVER_DISPATCH):數(shù)組中每一個(gè)指針指向一個(gè)入口函數(shù)。在接收到不同的請求包(IRP)時(shí),OS會(huì)調(diào)用不同的入口函數(shù)。35驅(qū)動(dòng)對象的一些關(guān)鍵字段(二)De

溫馨提示

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

評論

0/150

提交評論