當前位置:首頁 > 嵌入式 > 嵌入式教程
[導讀]模塊化的設(shè)備驅(qū)動程序設(shè)計方法

摘要:介紹了WindowsNT下設(shè)備驅(qū)動程序的開發(fā)環(huán)境,一種模塊化的設(shè)計方法,應用程序與驅(qū)動程序之間的同步以及驅(qū)動程序的安裝。

關(guān)鍵詞:WindowsNT;設(shè)備驅(qū)動程序;Event對象?

1引言

WindowsNT/2K以其形象直觀的界面、簡單方便的操作,基本上已經(jīng)取代DOS成為測控軟件的操作平臺。又因為WindowsNT/2K出于安全性、穩(wěn)定性的考慮,為了防止用戶應用程序訪問和更改重要的操作系統(tǒng)數(shù)據(jù),WindowsNT/2K使用兩種“處理器訪問模式”:用戶態(tài)和核心態(tài)。在用戶態(tài),應用程序不能直接對硬件進行訪問和操作;而在核心態(tài)中,程序?qū)θ魏蜪/O設(shè)備有全部的訪問權(quán),還能訪問任何虛地址和控制虛擬內(nèi)存硬件。為了使用戶態(tài)的程序訪問和操作硬件,必須通過某種機制,也就是使用設(shè)備驅(qū)動程序跨越操作系統(tǒng)的邊界對物理硬件進行訪問操作。同時提供一些控制接口,進而用戶態(tài)的應用程序利用設(shè)備驅(qū)動程序提供的接口間接地對物理硬件進行訪問操作。

2設(shè)備驅(qū)動程序的開發(fā)環(huán)境

安裝4種軟件:MicrosoftVisualC++6.0、PlatformSDK(SoftwareDevelopKit)forWindowsNT、DDK(DeviceDevelopKit)forWindowsNT、DriverStudio2.0。然后進行一些系統(tǒng)環(huán)境變量的設(shè)置:

(1)變量名:MSTOOLS,值:SDK在操作系統(tǒng)中的安裝路徑(如:C:mstools);

(2)變量名:CPU,值:i386;

(3)變量名:BASEDIR,值:DDK在操作系統(tǒng)中的安裝路徑(如:C:NTDDK)。

在開發(fā)驅(qū)動程序時,首先要生成DriverStudio需要的庫文件vdw.lib(通過編譯DriverStudio安裝目錄下\DriverWorks\Source\vdw.dsw)。然后運用DriverStudio2.0生成一個編程框架,并刪除DriverStudio所生成的編程框架中的所有文件,就可以在這個框架中編寫自己的設(shè)備驅(qū)動程序;編寫完以后可以直接在VisualC++6.0下Build生成設(shè)備驅(qū)動程序*.sys。

3模塊化驅(qū)動程序的編寫

3.1設(shè)備驅(qū)動程序包括的幾大模塊

設(shè)備驅(qū)動程序管理實際數(shù)據(jù)傳輸和控制物理設(shè)備的操作,包括開始和完成I/O操作、處理中斷和執(zhí)行設(shè)備要求的任何操作。

一般通用的設(shè)備驅(qū)動程序可以分為主要4個模塊:初始化例程、卸載例程、驅(qū)動程序和應用程序之間的數(shù)據(jù)交換例程、中斷服務(wù)例程。

3.1.1初始化例程(DrvierEntry)?

是驅(qū)動程序的入口。在這個例程中主要包括以下步驟:?

(1)初始化Driver對象;?

(2)調(diào)用IoCreateDevice創(chuàng)建一個Device對象,并通過調(diào)用IoCreateSymbolicLinks使設(shè)備對Win32子系統(tǒng)可見;

(3)初始化Device對象的DeviceExtension;?

(4)查找和分配驅(qū)動程序要管理的任何硬件;?

(5)把一個設(shè)備連接到一個Interrupt對象,如果需要并初始化驅(qū)動程序的DPC對象。?

3.1.2卸載例程(DriverUnload)

它與驅(qū)動程序的初始化例程剛好相反。

(1)把與設(shè)備連接的Interrupt對象斷開。一旦Interrupt對象消失,設(shè)備不產(chǎn)生任何中斷請求,這是最重要的;

(2)釋放驅(qū)動程序所占用的任何系統(tǒng)資源;

(3)使用IoDeleteSymbolicLink從Win32名字空間刪除設(shè)備,并用IoDeleteDevice刪除Device對象自身。

3.1.3驅(qū)動程序與應用程序之間的數(shù)據(jù)交換例程

首先簡單介紹一下I/0請求包(IRP):IRP是I/O系統(tǒng)用來存儲I/O請求信息的地方。IRP由兩部分組成:固定部分(稱作標題)和一個或多個堆棧單元。固定部分信息包括:請求的類型和大小、同步請求還是異步請求,用于緩沖I/O的指向緩沖區(qū)的指針和由于請求的進展而變化的狀態(tài)信息;IRP的堆棧單元包括一個功能碼、功能特定參數(shù)和一個指向調(diào)用者文件對象的指針。

應用程序與驅(qū)動程序交換數(shù)據(jù)主要是由Win32CreateFile、CloseHandle、ReadFile、WriteFile和DeviceIoControl函數(shù)發(fā)出請求,接著I/O管理器把這些請求轉(zhuǎn)化為叫做I/O請求包(IRP)的數(shù)據(jù)結(jié)構(gòu)形式,再由I/O管理器把這些I/O請求包發(fā)送到驅(qū)動程序。數(shù)據(jù)交換例程的主要作用是接收I/O管理器所發(fā)出的IRP,然后解析這些IRP,從而得知IRP從應用程序傳遞過來的數(shù)據(jù)。解析IRP主要是運用C語言的switch語句,根據(jù)IRP的堆棧單元中的參數(shù)(如IRP_MJ_CREATE、IRP_MJ_READ、IRP_MJ_DEVICE_CONTROL等)進行不同的處理。最后IRP的完成處理也非常重要,它要做的是返回系統(tǒng),完成一個I/O請求的信息,系統(tǒng)根據(jù)返回的信息釋放IRP,以便使系統(tǒng)順利進行下一個IRP的處理。這里需要說明的是這個例程只是完成了數(shù)據(jù)從應用程序到驅(qū)動程序的傳遞,而沒有進行任何實際的設(shè)備操作。

3.1.4中斷服務(wù)例程

中斷服務(wù)例程主要是進行直接的任何設(shè)備的操作。驅(qū)動程序與應用程序之間的數(shù)據(jù)交換例程只完成了數(shù)據(jù)從用戶空間到核心空間的傳遞,而中斷服務(wù)例程根據(jù)傳遞過來的數(shù)據(jù),直接對I/O端口進行訪問操作。

3.2設(shè)備驅(qū)動程序的模塊化實現(xiàn)

每個NT內(nèi)核模式驅(qū)動程序,不管它的用途是什么,都必須顯露一個叫做DriverEntry的例程,也就是設(shè)備驅(qū)動程序的初始化例程。它是驅(qū)動程序的入口點,DriverEntry是一個公認的名字(任何內(nèi)核驅(qū)動程序的入口點必須用這個名字,不能改變),有了這個公認的名字,I/O管理器就能順利地為每個驅(qū)動程序找到入口點并對其進行初始化。

一些函數(shù)聲明:

∥初始化Driver對象?

VOIDInitializeDriverObject(INPDRIVER_OBJECTDriverObject);?

∥創(chuàng)建一個Device對象和使設(shè)備對Win32子系統(tǒng)可見?

NTSTATUSCreateDevice(INPWSTRDriverName,?

INDRIVER_TYPEDriverType,?

INPDRIVER_OBJECTDriverObject,?

OUTPDEVICE_OBJECT*DeviceObject);?

∥初始化DeviceExtension?

VOIDInitializeDeviceExtension(INPDEVICE_OBJECTDeviceObject,?

INPDEVICE_EXTENSIONDeviceExtension);?

∥查找并給設(shè)備分配資源?

NTSTATUSQueryAndAllocateHardware(INPUNICODE--STRINGpath,?

INPDEVICE_OBJECTDeviceObject);?

∥連接一個中斷?

NTSTATUSDriverConnectInterrupt(?

INPDEVICE_EXTENSIONDeviceExtension);?

如果以上幾個函數(shù)中,有函數(shù)返回不成功的狀態(tài)值時,一定要刪除在調(diào)用這個函數(shù)之前創(chuàng)建成功的,可能是以下3個中的1個和多個:創(chuàng)建的Device對象、Win32名字空間的設(shè)備和給設(shè)備分配的系統(tǒng)資源。[!--empirenews.page--]

NTSTATUSDriverEntry(INPDRIVER_OBJECT

}

4應用程序與驅(qū)動程序之間的同步

一般在設(shè)備驅(qū)動程序中用中斷服務(wù)例程來訪問和操作硬件設(shè)備,它利用應用程序傳遞過來的數(shù)據(jù)進行中斷操作。為了保證外界設(shè)備正常工作,在驅(qū)動程序中一定要有一個緩沖區(qū)來存儲一定數(shù)量的數(shù)據(jù)。例如在數(shù)控加工中,讓機床切一個圓,必須保證機床在切這個圓時的動作連續(xù),如果沒有一個緩沖區(qū)存儲一定數(shù)量的數(shù)據(jù),就有可能出現(xiàn)驅(qū)動程序等待應用程序傳遞數(shù)據(jù),從而造成機床的暫時停頓。然而如果在驅(qū)動程序中開一個緩沖區(qū)來存儲數(shù)據(jù),也會產(chǎn)生一個問題:應用程序傳遞的數(shù)據(jù)與這些數(shù)據(jù)的執(zhí)行之間有一定的時間差,導致應用程序不知道設(shè)備正在進行什么操作。為了解決這個問題,也就是要保證應用程序與驅(qū)動程序之間的同步。有了這個同步信號,可以讓應用程序了解設(shè)備正在進行何種操作。解決同步問題可以用Event對象。

具體方法:在驅(qū)動程序中創(chuàng)建內(nèi)核的Event對象,但是又因為驅(qū)動程序和應用程序分別運行于核心層和用戶層,因此他們之間要看到對方定義的事件相對比較困難,必須要有一個專門的事件名存放空間。這里有一個命名方法可以使用戶層和核心層都可看到Event對象,事件命名應為L\BaseNamedObjects\xxx形式。

在核心層用IoCreateNotificationEvent創(chuàng)建一個Event對象,用KeSetEvent把Event對象設(shè)置為Signal。用戶層用OpenEvent創(chuàng)建Event對象,這個Event對象名一定要與在核心層創(chuàng)建的Event對象名一樣,然后用戶層用WaitForSingleObject等待Event對象的狀態(tài)為Signal,一旦Event對象的狀態(tài)為Signal,讓應用程序訪問一次驅(qū)動程序,從而可以讓應用程序知道設(shè)備正在進行的操作,保證應用程序與驅(qū)動程序之間的同步。

5設(shè)備驅(qū)動程序的安裝

設(shè)備驅(qū)動程序的安裝可以分為:手動安裝、非標準驅(qū)動程序的最終用戶安裝和標準驅(qū)動程序的最終用戶安裝。這里主要介紹前兩種方法。

5.1手動安裝

主要用于驅(qū)動程序的開發(fā)過程中,主要執(zhí)行以下的基本步驟:

(1)把編譯好的*.sys文件拷貝到系統(tǒng)的%SystemRoot%\system32\drivers目錄下。?

(2)在注冊表中加入合適的項:

(3)使用控制面板中的Device應用小程序啟動驅(qū)動程序。?

5.2非標準驅(qū)動程序的最終用戶安裝?

主要是使用下面一些Win32API調(diào)用建立自己的安裝程序:?

(1)CopyFile把驅(qū)動程序文件(包括一些自己定義的參數(shù)文件)拷貝到指定的目錄。

(2)RegCreateKeyEx和RegSetValueEx在Registry中建立驅(qū)動程序需要的鍵和值。?

(3)CreateService和StartService創(chuàng)建和啟動驅(qū)動程序。?

(4)OpenService和DeleteService來卸載驅(qū)動程序。?

6結(jié)論

通過模塊化的方法介紹了驅(qū)動程序的寫法、驅(qū)動程序的開發(fā)環(huán)境和安裝,給讀者一個清晰的驅(qū)動程序的開發(fā)過程,有助于初學者快速抓住驅(qū)動程序開發(fā)的框架。

本站聲明: 本文章由作者或相關(guān)機構(gòu)授權(quán)發(fā)布,目的在于傳遞更多信息,并不代表本站贊同其觀點,本站亦不保證或承諾內(nèi)容真實性等。需要轉(zhuǎn)載請聯(lián)系該專欄作者,如若文章內(nèi)容侵犯您的權(quán)益,請及時聯(lián)系本站刪除。
換一批
延伸閱讀

9月2日消息,不造車的華為或?qū)⒋呱龈蟮莫毥谦F公司,隨著阿維塔和賽力斯的入局,華為引望愈發(fā)顯得引人矚目。

關(guān)鍵字: 阿維塔 塞力斯 華為

加利福尼亞州圣克拉拉縣2024年8月30日 /美通社/ -- 數(shù)字化轉(zhuǎn)型技術(shù)解決方案公司Trianz今天宣布,該公司與Amazon Web Services (AWS)簽訂了...

關(guān)鍵字: AWS AN BSP 數(shù)字化

倫敦2024年8月29日 /美通社/ -- 英國汽車技術(shù)公司SODA.Auto推出其旗艦產(chǎn)品SODA V,這是全球首款涵蓋汽車工程師從創(chuàng)意到認證的所有需求的工具,可用于創(chuàng)建軟件定義汽車。 SODA V工具的開發(fā)耗時1.5...

關(guān)鍵字: 汽車 人工智能 智能驅(qū)動 BSP

北京2024年8月28日 /美通社/ -- 越來越多用戶希望企業(yè)業(yè)務(wù)能7×24不間斷運行,同時企業(yè)卻面臨越來越多業(yè)務(wù)中斷的風險,如企業(yè)系統(tǒng)復雜性的增加,頻繁的功能更新和發(fā)布等。如何確保業(yè)務(wù)連續(xù)性,提升韌性,成...

關(guān)鍵字: 亞馬遜 解密 控制平面 BSP

8月30日消息,據(jù)媒體報道,騰訊和網(wǎng)易近期正在縮減他們對日本游戲市場的投資。

關(guān)鍵字: 騰訊 編碼器 CPU

8月28日消息,今天上午,2024中國國際大數(shù)據(jù)產(chǎn)業(yè)博覽會開幕式在貴陽舉行,華為董事、質(zhì)量流程IT總裁陶景文發(fā)表了演講。

關(guān)鍵字: 華為 12nm EDA 半導體

8月28日消息,在2024中國國際大數(shù)據(jù)產(chǎn)業(yè)博覽會上,華為常務(wù)董事、華為云CEO張平安發(fā)表演講稱,數(shù)字世界的話語權(quán)最終是由生態(tài)的繁榮決定的。

關(guān)鍵字: 華為 12nm 手機 衛(wèi)星通信

要點: 有效應對環(huán)境變化,經(jīng)營業(yè)績穩(wěn)中有升 落實提質(zhì)增效舉措,毛利潤率延續(xù)升勢 戰(zhàn)略布局成效顯著,戰(zhàn)新業(yè)務(wù)引領(lǐng)增長 以科技創(chuàng)新為引領(lǐng),提升企業(yè)核心競爭力 堅持高質(zhì)量發(fā)展策略,塑強核心競爭優(yōu)勢...

關(guān)鍵字: 通信 BSP 電信運營商 數(shù)字經(jīng)濟

北京2024年8月27日 /美通社/ -- 8月21日,由中央廣播電視總臺與中國電影電視技術(shù)學會聯(lián)合牽頭組建的NVI技術(shù)創(chuàng)新聯(lián)盟在BIRTV2024超高清全產(chǎn)業(yè)鏈發(fā)展研討會上宣布正式成立。 活動現(xiàn)場 NVI技術(shù)創(chuàng)新聯(lián)...

關(guān)鍵字: VI 傳輸協(xié)議 音頻 BSP

北京2024年8月27日 /美通社/ -- 在8月23日舉辦的2024年長三角生態(tài)綠色一體化發(fā)展示范區(qū)聯(lián)合招商會上,軟通動力信息技術(shù)(集團)股份有限公司(以下簡稱"軟通動力")與長三角投資(上海)有限...

關(guān)鍵字: BSP 信息技術(shù)
關(guān)閉
關(guān)閉