Windows CE和 Windows2000/XP設(shè)備驅(qū)動(dòng)開發(fā)的區(qū)別
引 言
Windows CE是一個(gè)32位、多任務(wù)、多線程的嵌入式操作系統(tǒng),是微軟專門為信息設(shè)備、移動(dòng)應(yīng)用、消費(fèi)類電子產(chǎn)品、嵌入式應(yīng)用等非PC領(lǐng)域設(shè)計(jì)的操作系統(tǒng)產(chǎn)品,在外觀和使用的感覺上十分接近桌面Windows系統(tǒng)。它使用平面內(nèi)存模式尋址,可以同時(shí)運(yùn)行多個(gè)程序并支持一個(gè)程序中的多個(gè)線程,并且非常精煉,只有很小的內(nèi)存要求。與基于PC的操作系統(tǒng)不同,Windows CE不需要標(biāo)準(zhǔn)硬件,反而支持各種各樣的CPU(如X86、PowerPC、ARM、MIPS等),通過OEM適配層(OEM adaptation layer)可以把Windows CE適配到任何硬件平臺(tái)。Windows CE是微軟Windows操作系統(tǒng)家族的一個(gè)成員,支持用于Windows 2000/XP和Windows 98等桌面Windows操作系統(tǒng)的Win32 API的一個(gè)子集。由于它不是桌面Windows操作系統(tǒng)的一部分或縮減版本,使得開發(fā)Windows CE的驅(qū)動(dòng)程序與開發(fā)桌面Windows的驅(qū)動(dòng)程序有所不同。本文將著重討論這些區(qū)別,以使廣大熟悉桌面Windows驅(qū)動(dòng)程序開發(fā)的程序員能快速掌握嵌入式操作系統(tǒng)WindowsCE驅(qū)動(dòng)程序的開發(fā)方法。
1 驅(qū)動(dòng)結(jié)構(gòu)模型比較
在桌面Windows系統(tǒng),以支持Windows2000/XP的WDM驅(qū)動(dòng)模型為例。WDM體系結(jié)構(gòu)實(shí)行分層處理,即設(shè)備驅(qū)動(dòng)被分成了若干層――最高層驅(qū)動(dòng)程序、中間層驅(qū)動(dòng)程序、最低層驅(qū)動(dòng)程序,如圖1所示。
在Windows CE驅(qū)動(dòng)中,按驅(qū)動(dòng)的結(jié)構(gòu)可以分為兩種類型――分層式設(shè)備驅(qū)動(dòng)程序和整體式驅(qū)動(dòng)程序,如圖2所示。分層式設(shè)備驅(qū)動(dòng)程序由上層和下層兩部分代碼組成。上層的程序叫做模型設(shè)備驅(qū)動(dòng)程序(MDD),下層的程序則叫做平臺(tái)相關(guān)的驅(qū)動(dòng)程序(PDD)。整體式驅(qū)動(dòng)程序的源代碼由中斷服務(wù)線程代碼和針對(duì)平臺(tái)的代碼組成。
同桌面Windows設(shè)備驅(qū)動(dòng)結(jié)構(gòu)模型相比,Windows CE設(shè)備驅(qū)動(dòng)相對(duì)簡(jiǎn)單一些。正如圖1和圖2所示,兩種操作系統(tǒng)的設(shè)備驅(qū)動(dòng)雖然存在許多相似的地方,都采用了模塊、分層的設(shè)計(jì)方法,但是還存在許多不同的地方。在Windows CE操作系統(tǒng)中,分層的驅(qū)動(dòng)程序并不適用于所用的驅(qū)動(dòng),尤其是將驅(qū)動(dòng)程序分為兩層將會(huì)導(dǎo)致在驅(qū)動(dòng)程序操作時(shí)附加的功能調(diào)用,這無疑會(huì)降低驅(qū)動(dòng)程序的效率。對(duì)于時(shí)間或性能關(guān)鍵的實(shí)時(shí)操作,整體式驅(qū)動(dòng)程序?qū)?huì)更適合。
在桌面Windows系統(tǒng)中,驅(qū)動(dòng)各層通信之間使用一種稱為I/O請(qǐng)求包(IRP)的數(shù)據(jù)結(jié)構(gòu)進(jìn)行通信。影響到設(shè)備的每個(gè)操作都使用I/O請(qǐng)求包,采用層次結(jié)構(gòu)可以使I/O請(qǐng)求過程更加明了。I/O管理器發(fā)送IRP來請(qǐng)求驅(qū)動(dòng)程序的處理,通常IRP由分層的驅(qū)動(dòng)程序棧來處理,高層的驅(qū)動(dòng)程序把請(qǐng)求劃分成更簡(jiǎn)單的請(qǐng)求并傳遞給下層驅(qū)動(dòng)程序。IRP首先被送到設(shè)備堆棧的最上層驅(qū)動(dòng)程序,然后逐漸過濾到下層的驅(qū)動(dòng)程序。每一層驅(qū)動(dòng)程序都可以決定如何處理IRP。而Windows CE驅(qū)動(dòng)各層之間的通信沒有采用IRP通信機(jī)制,而是通過接口函數(shù)調(diào)用實(shí)現(xiàn)的。設(shè)備驅(qū)動(dòng)程序接口(Device Driver Interface,DDI)是在MDD層中實(shí)現(xiàn)的函數(shù)集,系統(tǒng)中的GWES模塊通過這個(gè)接口調(diào)用設(shè)備驅(qū)動(dòng)程序;設(shè)備驅(qū)動(dòng)程序服務(wù)器接口(Device Driver Service Provider Interface,DDSI)是在PDD層中實(shí)現(xiàn)的函數(shù)集并由MDD調(diào)用。
2 設(shè)備驅(qū)動(dòng)組成部分比較
簡(jiǎn)單地說,驅(qū)動(dòng)程序是一些例程的集合,它們被動(dòng)地存在,等待主機(jī)系統(tǒng)軟件來調(diào)用或激活它們。在Win-dows系統(tǒng)中驅(qū)動(dòng),具體的驅(qū)動(dòng)程序有所不同,其包含的例程也不同,但其主要例程是相同的。圖3描述一個(gè)Windows驅(qū)動(dòng)的基本流程。
以下從幾個(gè)方面闡述WindowsCE和桌面Windows設(shè)備驅(qū)動(dòng)組成的不同。
2.1 驅(qū)動(dòng)程序的入口點(diǎn)
在桌面Windows和Windows CE兩個(gè)系統(tǒng)中的驅(qū)動(dòng)程序都含有初始化模塊,該模塊主要功能是完成驅(qū)動(dòng)程序的初始化及卸載。在桌面Windows系統(tǒng)的初始化模塊中,包括每一個(gè)設(shè)備驅(qū)動(dòng)程序都有的一個(gè)初始化入口點(diǎn)――DriverEntry例程,每次設(shè)備驅(qū)動(dòng)程序啟動(dòng)時(shí)該例程被系統(tǒng)自動(dòng)調(diào)用。其最重要的功能是設(shè)置驅(qū)動(dòng)程序?qū)?yīng)于I/O請(qǐng)求的主功能代碼(MajorFunction)的回調(diào)例程。DriverEntry例程如下:
評(píng)論