備忘:這裡的核心指kernel,其表現形式為kernel.dll,OS指作業系統,core指核心。
圖1 WINCE6.0體繫結構
1. kernel的組成和功能
WINCE6.0作業系統內(kernel)在代碼中的表現形式是kernel.dll(也就是kern.dll), WINCE5.0中核心的表現形式為NK.exe,而WINCE6.0中的NK.exe中僅僅包含一些OAL代碼和保持相容性的程式了。
核心提供任何WINCE6.0裝置的基本OS功能,這些準系統包括進程、線程和記憶體管理,另外核心也提供一些檔案管理功能、線程調度、即時效能、裝載器(loader)、系統調用、電源管理和OS提供的多種多樣的服務。核心服務(service)使應用程式可以使用這些核心(core)功能。
NK.exe是OAL層的進程,在OAL層啟動的過程中載入kernel.dll。使用核心進程和線程函數可以建立、終止、同步進程和線程,並且可以調度和掛起線程。進程是正在啟動並執行程式(比如iexplore.exe)的單個執行個體,這樣使得同時可以運行多個程式,對於WINCE5.0來說能夠同時啟動並執行進程是32個,假如我們同時開啟多個Internet Explorer瀏覽器(對應一個iexplore.exe),那這時記憶體中就相應有多個瀏覽器的進程,所以WINCE5.0作業系統如果要應用在網路系統,尤其是同時運行多進程的系統中並不是很好的選擇。WINCE6.0支援同時啟動並執行進程數達到32000個,就基本不存在這方面應用的限制。線程使得程式一次可以執行多個任務,因為一個程式可以建立多個線程。線程優先等級、優先順序繼承、中斷支援、和計時(timing)與調用也都是核心包含的功能。核心的所有功能共同為對時間要求很嚴格的系提供即時應用。
WINCE核心基於頁式虛擬記憶體系統(virtual-memory system)來管理和分配應用記憶體,虛擬記憶體系統提供連續的大小為64KB記憶體塊,每塊的大小為4KB,所以應用程式不需要管理記憶體的分配。如果一個應用程式需要使用小於64KB的記憶體,那麼它可以使用局部堆(local heap)或是建立獨立的堆來提供記憶體空間。核心也要為每個新的進程或線程分配棧(stack)空間。
核心使用記憶體函數來分配和釋放虛擬記憶體,可以使用local堆和獨立堆的記憶體,可以從棧中分配記憶體,也可以使用裝載應用程式所需要分配但又沒有使用的待用資料庫記憶體。而且進程可以使用記憶體映射對象(memory-mapped object)來共用資料。
2. Kernel.dll的編譯產生
在common.bib檔案中可以找到下面的內容:
IF IMGPROFILER !
kernel.dll $(_FLATRELEASEDIR)\kern.dll NK SHZ
ENDIF IMGPROFILER !
可知kernel.dll實際就是kern.dll,那kern.dll在哪裡產生的呢?沒有找到和kern.dll相關的sources檔案,但在\WINCE600\PUBLIC\COMMON\CESYSGEN\makefile檔案中,從下面的內容可以看到kern.dll是如何編譯產生的
圖2 指示產生kern.dll的makefile內容