WinCE6.0的OAL跟WinCE5.0中的有較大差別。瞭解這些差別,對我們移植OAL部分很有協助。本文將簡要介紹WinCE6.0 OAL的特點。
WinCE5.0將核心、OAL和KITL連結成一個核心可執行檔NK.exe。而WinCE6.0將這三者分開,分別對應Kernel.dll、OAL.exe和KITL.dll。顯而易見,這樣做最大的好處是可以單獨升級這三者中的任何一個,而先前的結構則是牽一髮而動全身的。WinCE5.0的OAL結構1所示:
圖1
WinCE6.0的OAL結構2所示:
圖2
對比圖1和圖2,可以看到CE6.0的OAL在功能上和CE5.0的基本一致,主要包括初始化、中斷管理和IOCTL等。在圖2中增加了NKStub.lib、NKGLOBAL和OEMGLOBAL等內容。這對於WinCE6.0是至關重要的。在CE5.0中,由於核心、OAL和KITL最終連結到一個可執行程式中,所以可以直接相互調用彼此的函數。這看起來很方便,但存在安全隱患,甚至在更新核心代碼的時候會影響到OAL的執行。Kernel、OAL和KITL相互獨立,則消除了這個安全隱患。現在,它們之間的通訊是通過包涵函數指標和變數值的全域結構變數來實現的。每個模組編譯一個函數指標列表以提供給其他模組使用,而列表中沒有的函數將不能被別的模組調用。核心模組匯出列表NKGLOBAL,主要包括虛擬記憶體操作、註冊表訪問和字串處理等一些核心API以及共用的全域變數。OAL只能調用該列表中包括的核心API。為了方便OAL代碼的移植,微軟將函數指標列表封裝到NKStub.lib中。所以,我們在移植OAL代碼時沒有必要通過結構中的函數指標去調用核心API,OAL代碼保持原來的函數調用方式。簡單看一下NKStub.c的代碼實現,下面是部分代碼:
BOOL INTERRUPTS_ENABLE (BOOL fEnable)
{
return g_pNKGlobal->pfnINT_ENABLE (fEnable);
}
可以看到,OAL中調用相應的核心API時,NKStub將執行對應的結構中的函數指標。所以在編譯OAL時,添加NKStub.lib後就可以跟以前一樣使用這些核心功能。當然NKStub也包括了KITL中的相應函數列表,所以OAL也能使用KITL中的函數。
OAL匯出了列表OEMGLOBAL,其中包括了OAL函數指標和全域變數。其中有很多函數指標是必須的,如果缺少,系統將不能正常工作。而另外有些函數指標則是可選的。具體內容可查看PB協助的相應部分。OEMGLOBAL的定義在檔案:C:\WINCE600\PRIVATE\WINCEOS\COREOS\NK\OEMMAIN\oemglobal.c中。
總結一下,CE6.0的OAL從核心中獨立出來,這樣方便OAL的單獨升級,也提高了安全性。由於核心、OAL和KITL相互獨立,所以引入了NKGLOBAL和OEMGLOBAL這兩個結構以支援模組間的函數調用。為了方便代碼的移植,CE6.0提供了NKStub.lib和OEMStub.lib,他們做了從函數指標到函數的轉換工作。所以,在移植BSP時,原來的代碼可保持不變。
到這裡,我們已經知道了WinCE6.0的OAL的特點。實際移植時,還需要注意OAL的目錄組織。這裡將5.0和6.0 OAL部分的目錄組織做一個對比。
CE5.0 OAL目錄組織 |
對應檔案 |
%_WINCEROOT%\platform\BSPNAME\src\kernel\oal |
oal.lib |
%_WINCEROOT%\platform\BSPNAME\src\kernel\kern |
kern.exe |
%_WINCEROOT%\platform\BSPNAME\src\kernel\kernkitl |
kernkitl.exe |
%_WINCEROOT%\platform\BSPNAME\src\kernel\kernkitlprof |
kernkitlprof.exe |
CE6.0 OAL目錄組織 |
Builds |
%_WINCEROOT%\platform\BSPNAME\src\oal\oallib |
oal.lib |
%_WINCEROOT%\platform\BSPNAME\src\oal\oalexe |
oal.exe |
%_WINCEROOT%\platform\BSPNAME\src\kitl |
kitl.dll |
其中,6.0的OALLIB對應5.0的OAL,OALEXE對應Kern,KITL對應Kernkitl。而5.0的kernkitlprof在6.0中一般放在oallib的目錄下。在移植BSP時可參照該對應關係進行目錄組織。
本文從功能結構和目錄組織上介紹了WinCE6.0 OAL的特點,在移植BSP時可作參考。有關OAL移植的具體實現,後文將詳細介紹。另外,文中有不貼切的地方歡迎您指正。