天天看點

WinCE和Win2000/XP裝置驅動開發的差別

關鍵字:WinCE Win2000/XP 驅動程式

引 言

    Windows CE是一個32位、多任務、多線程的嵌入式作業系統,是微軟專門為資訊裝置、移動應用、消費類電子産品、嵌入式應用等非PC領域設計的作業系統産品,在外觀和使用的感覺上十分接近桌面Windows系統。它使用平面記憶體模式尋址,可以同時運作多個程式并支援一個程式中的多個線程,并且非常精煉,隻有很小的記憶體要求。與基于PC的作業系統不同,Windows CE不需要标準硬體,反而支援各種各樣的CPU(如X86、PowerPC、ARM、MIPS等),通過OEM适配層(OEM adaptation layer)可以把Windows CE适配到任何硬體平台。Windows CE是微軟Windows作業系統家族的一個成員,支援用于Windows 2000/XP和Windows 98等桌面Windows作業系統的Win32 API的一個子集。由于它不是桌面Windows作業系統的一部分或縮減版本,使得開發Windows CE的驅動程式與開發桌面Windows的驅動程式有所不同。本文将着重讨論這些差別,以使廣大熟悉桌面Windows驅動程式開發的程式員能快速掌握嵌入式作業系統WindowsCE驅動程式的開發方法。

1 驅動結構模型比較

    在桌面Windows系統,以支援Windows2000/XP的WDM驅動模型為例。WDM體系結構實行分層處理,即裝置驅動被分成了若幹層——最高層驅動程式、中間層驅動程式、最低層驅動程式,如圖1所示。

WinCE和Win2000/XP裝置驅動開發的差別

    在Windows CE驅動中,按驅動的結構可以分為兩種類型——分層式裝置驅動程式和整體式驅動程式,如圖2所示。分層式裝置驅動程式由上層和下層兩部分代碼組成。上層的程式叫做模型裝置驅動程式(MDD),下層的程式則叫做平台相關的驅動程式(PDD)。整體式驅動程式的源代碼由中斷服務線程代碼和針對平台的代碼組成。

    同桌面Windows裝置驅動結構模型相比,Windows CE裝置驅動相對簡單一些。正如圖1和圖2所示,兩種作業系統的裝置驅動雖然存在許多相似的地方,都采用了子產品、分層的設計方法,但是還存在許多不同的地方。在Windows CE作業系統中,分層的驅動程式并不适用于所用的驅動,尤其是将驅動程式分為兩層将會導緻在驅動程式操作時附加的功能調用,這無疑會降低驅動程式的效率。對于時間或性能關鍵的實時操作,整體式驅動程式将會更适合。

WinCE和Win2000/XP裝置驅動開發的差別

    在桌面Windows系統中,驅動各層通信之間使用一種稱為I/O請求包(IRP)的資料結構進行通信。影響到裝置的每個操作都使用I/O請求包,采用層次結構可以使I/O請求過程更加明了。I/O管理器發送IRP來請求驅動程式的處理,通常IRP由分層的驅動程式棧來處理,高層的驅動程式把請求劃分成更簡單的請求并傳遞給下層驅動程式。IRP首先被送到裝置堆棧的最上層驅動程式,然後逐漸過濾到下層的驅動程式。每一層驅動程式都可以決定如何處理IRP。而Windows CE驅動各層之間的通信沒有采用IRP通信機制,而是通過接口函數調用實作的。裝置驅動程式接口(Device Driver Interface,DDI)是在MDD層中實作的函數集,系統中的GWES子產品通過這個接口調用裝置驅動程式;裝置驅動程式伺服器接口(Device Driver Service Provider Interface,DDSI)是在PDD層中實作的函數集并由MDD調用。

2 裝置驅動組成部分比較

    簡單地說,驅動程式是一些例程的集合,它們被動地存在,等待主機系統軟體來調用或激活它們。在Win-dows系統中驅動,具體的驅動程式有所不同,其包含的例程也不同,但其主要例程是相同的。圖3描述一個Windows驅動的基本流程。

WinCE和Win2000/XP裝置驅動開發的差別

    以下從幾個方面闡述WindowsCE和桌面Windows裝置驅動組成的不同。

2.1 驅動程式的入口點

    在桌面Windows和Windows CE兩個系統中的驅動程式都含有初始化子產品,該子產品主要功能是完成驅動程式的初始化及解除安裝。在桌面Windows系統的初始化子產品中,包括每一個裝置驅動程式都有的一個初始化入口點——DriverEntry例程,每次裝置驅動程式啟動時該例程被系統自動調用。其最重要的功能是設定驅動程式對應于I/O請求的主功能代碼(MajorFunction)的回調例程。DriverEntry例程如下:

WinCE和Win2000/XP裝置驅動開發的差別

    其中,AddDevice例程是在系統添加一個裝置時被PnP管理器調用的,其主要工作是建立并初始化裝置對象;DriverUnload例程在系統解除安裝硬體時使用,由I/O管理器調用,釋放所有資源。初始化子產品中還包括Create和Close兩個例程,這是Win32程式獲得和釋放裝置句柄的唯一途徑。

    與桌面Windows裝置驅動程式開發相比,WindowsCE裝置驅動程式開發的主要難點是,對于不同類型裝置的驅動程式架構是不一樣的。以流接口驅動程式為例,Windows CE裝置驅動程式是使用者模式動态連結庫(DLL),其入口點在不同的情況有一些細微的差别,主要入口點包括XXX_Init、XXX_Deinit、XXX_Open、XXX_Close、XXX_IOControl、XXX_Read、XXX_Seek、XXX_PowerUp和XXX_PowerDown,在實際開發中接口名稱中的XXX三個字母由裝置驅動的裝置檔案名字首代替。

2.2 與應用程式的通信

    裝置驅動程式構造成功之後,将它與裝置一同安裝進系統,以便使用者可以對裝置進行适當的控制及通路。在桌面Windows和Windows CE兩個系統中使用Win32 API實作硬體的通路。首先調用CreateFile建立一個裝置的連接配接,獲得該裝置的句柄(Handle),然後根據需要調用ReadFile、WriteFile、DeviceIoControI等函數對裝置進行讀寫或者其他I/O控制操作,最後調用CloseHandle關閉裝置。

    在桌面Windows系統中,當使用者需要通路某裝置時,必須首先取出指定裝置全局唯一辨別符(GUID)的裝置資訊集,枚舉裝置執行個體的接口資料,從中獲得裝置的符号連結名,然後調用CreatFile建立裝置,并獲得裝置句柄,而在驅動程式内部通過處理IRP響應來自Win32應用程式對IRP_MJ_CREATE、IRP_MJ_READ、IRP_MJ_WRITE和IRP_MJ_OCTL等請求。IRP由IRP首部結構和一系列的棧單元組成,每個棧單元是一個IO_STACK_LOCA-TION結構。驅動程式僅需知道目前I/O棧單元和IRP首部結構中的資訊就可以對IRP進行處理。驅動程式處理完IRP後,使用IoCompleteRequest函數通知I/O管理器,可以通過其參數設定狀态碼和傳回的位元組數。在Windows CE系統中,應用程式需要了解中斷處理線程中資料的輸入輸出完成情況,以便及時地處理。這就需要建立應用程式和裝置驅動程式的同步通信。

2.3 裝置名

    在Windows裝置驅動中,為了提供Win32程式可用的名字,必須為每個裝置建立符号連結。在桌面Windows和Windows CE兩個系統中,都可以采用一個明确的符号連結名。一個具體裝置名稱是由裝置名字首和裝置名索引組成的,即3個大寫字母、1位數字和冒号組成。另外在桌面Windows系統中,還可以采用裝置接口為裝置建立符号連結。每個裝置接口由一個128位全局唯一辨別符(GUID)标志。把裝置注冊為一個特定的裝置接口就建立了一個符号連結。使用者态裝置可以取得擁有此GUID的裝置。

2. 4 驅動程式的運作模式

    在Windows系統中支援兩種基本模式的驅動程式類型,即使用者模式(user mode)和核心模式(kernel mode),不同的模式允許不同層次的記憶體存取和系統資源的配置設定。核心模式驅動程式則由運作于核心模式的系統級代碼組成,它們沒有系統資源存取的限制,可以執行任何有效的CPU指令,被用來直接控制硬體。使用者模式驅動程式是按使用者模式運作的系統級代碼,它們不能使用直接的硬體I/O指令來通路硬體。

    桌面Windows系統一般要求裝置驅動運作在核心模式下。核心模式提供裝置資源的直接通路,沒有固定的使用者模式的輔助操作。

    Windows CE系統一般要求裝置驅動運作在使用者模式下。這種運作在使用者模式下的裝置驅動程式有許多優點,最明顯的優點是當裝置驅動開發有錯誤動作時,核心被有效地保護起來了,是以核心被驅動程式破壞,或者可能導緻不能重新啟動核心的潛在目标存儲錯誤,以及其他意想不到的災難等發生的可能性就明顯地減少。

2.5 驅動程式的安裝

    桌面Windows的驅動安裝通過INF檔案。INF檔案是一個文本檔案,含有安裝一個WDM驅動裝置程式需要的所有必需的資訊,包括要複制的檔案清單、要建立的系統資料庫項等。驅動根據INF檔案中的指令安裝,驅動程式可執行檔案被複制到正确的位置,通常是Windows Sys-tem32\Drivers目錄,然後建立各種系統資料庫項。WindowsCE和桌面Windows之間的最大差別是,Windows CE不支援.sys和.inf檔案。Windows CE裝置驅動編譯成動态庫,将驅動的動态庫檔案直接拷入Windows\目錄,然後建立各種系統資料庫項即可。這就減少了Windows CE加載程式的複雜性和大小。

3 開發環境比較

    在桌面Windows系統中,驅動程式的開發采用兩種方式。一類是Microsoft公司提供的Windows DDK(De-vice Driver Kit),由于DDK基于彙編語言的程式設計方式和核心模式的調用,對沒有深厚的OS原理和程式設計水準的人員來說,任務相當艱巨。另一類是NuMega公司提供的DriverStudio,它是一個大的開發工具包,包含VtoolsD、SoftICE和DriverWorks等開發工具。利用DriverStudio開發WDM驅動程式,可以大大減輕開發人員的工作量、縮短開發周期,以及降低開發驅動程式的難度。

    Windows CE開發平台的開發者、獨立硬體供應商(IHVS)和應用程式開發者都會從事基于Windows CE平台的裝置驅動程式開發。對于不同的開發者,微軟為Windows CE提供了2種開發工具:Platform Builder和Embedded Visual Tools。Platform Builder是一個定制基于Windows CE作業系統的嵌入式平台的內建開發環境(IDE),為建立Windows CE嵌入式系統提供了全部相關工具,範圍從用來開發基于Windows CE的應用程式和裝置驅動程式,到用來建立作業系統各種自定義版本。而Embedded Visual Tools主要用于上層應用程式、驅動的開發,功能類似于桌面Windows平台上的開發工具VC、VB等。這個工具的核心是Embedded Visual C++,它具有和Visual C++6.0基本相同的特性,包括對MFC、ATL以及COM/DCOM的支援、應用程式向導、編譯調試等多種功能。

結 語

    了解Windows CE與桌面Windows裝置驅動程式開發的差別,有助于廣大熟悉桌面Windows裝置驅動程式開發的程式員快速掌握嵌入式作業系統Windows CE的裝置驅動程式開發。近幾年來,資訊家電、掌上電腦、電視機頂盒等基于Windows CE作業系統的裝置已變得越來越普及,而Windows CE上的裝置驅動程式還比較少,是以Windows CE裝置驅動程式具有不少潛力和市場。希望本文對打算開發Windows CE裝置驅動程式的人們有所幫助。

(本文轉自電子工程世界:http://www.eeworld.com.cn/qrs/2009/1228/article_2028.html)