在WINCE6.0中,內核(kernel)和OEM代碼(OEM code)被分成三部分:oal.exe、kernel.dll和kitl.dll這三部分,其中啓動代碼(startup code)和OAL層的實現部分不再和內核鏈接生成NK.exe,取而代之的是啓動代碼和硬件相關並且獨立於內核的OAL層的實現部分編譯成oal.exe,而與內核相關並獨立於硬件的OAL層代碼包含在kernel.dll中。內核無關傳輸層(KITL)的支持代碼從OAL層分離出來編譯成kitl.dll。
1.Oal.exe
先看看Src/Oal/Oallib/sources文件的如下部分:
RELEASETYPE=PLATFORM
TARGETNAME=oal
TARGETTYPE=LIBRARY
我們可知會編譯生成oal.lib,那麼oal.lib又在哪裏被使用了,接下來看看Src/Oal/Oalexe/sources文件的如下部分:
TARGETNAME=oal
TARGETTYPE=PROGRAM
RELEASETYPE=PLATFORM
SYNCHRONIZE_DRAIN=1
NOMIPS16CODE=1
EXEENTRY=StartUp
LDEFINES=-subsystem:native /DEBUG /DEBUGTYPE:CV /FIXED:NO
NOLIBC=1
SOURCES=
TARGETLIBS= /
$(_TARGETPLATROOT)/lib/$(_CPUDEPPATH)/oal.lib /
$(_COMMONOAKROOT)/lib/$(_CPUDEPPATH)/nkstub.lib /
$(_COMMONOAKROOT)/lib/$(_CPUDEPPATH)/nkldr.lib /
$(_COMMONOAKROOT)/lib/$(_CPUDEPPATH)/oemmain.lib /
$(_TARGETPLATROOT)/lib/$(_CPUINDPATH)/oal_abort_s3c2443.lib /
$(_TARGETPLATROOT)/lib/$(_CPUINDPATH)/oal_cache_s3c2443.lib /
$(_TARGETPLATROOT)/lib/$(_CPUINDPATH)/oal_memory_s3c2443.lib /
$(_TARGETPLATROOT)/lib/$(_CPUINDPATH)/oal_timer_s3c2443.lib /
$(_TARGETPLATROOT)/lib/$(_CPUINDPATH)/oal_intr_s3c2443.lib /
$(_TARGETPLATROOT)/lib/$(_CPUINDPATH)/oal_power_s3c2443.lib /
$(_TARGETPLATROOT)/lib/$(_CPUINDPATH)/oal_rtc_s3c2443.lib /
$(_TARGETPLATROOT)/lib/$(_CPUINDPATH)/oal_ioctl_s3c2443.lib /
$(_TARGETPLATROOT)/lib/$(_CPUINDPATH)/oal_profiler_s3c2443.lib /
$(_TARGETPLATROOT)/lib/$(_CPUINDPATH)/s3c2443_args.lib /
$(_PLATCOMMONLIB)/$(_CPUINDPATH)/oal_io.lib /
$(_PLATCOMMONLIB)/$(_CPUDEPPATH)/oal_other.lib /
$(_PLATCOMMONLIB)/$(_CPUDEPPATH)/oal_log.lib /
$(_TARGETPLATROOT)/lib/$(_CPUDEPPATH)/smflash_lib.lib /
$(_COMMONOAKROOT)/lib/$(_CPUINDPATH)/fulllibc.lib
首先可以知道Src/Oal/Oalexe下面會編譯生成oal.exe,也知道oal.exe中不僅包含了oal.lib,還包含了很多很重要的庫。
2.Kernel.dll
Kernel.dll在哪裏編譯生成的呢?我們看看release目錄下ce.bib的如下內容:
從上圖我們可以看到WinCE6.0編譯器將oal.exe更名爲nk.exe,而將kern.dll文件更名爲 kernel.dll,也就是說,kern.dll文件的實現部分就是kernel.dll的實現體。那麼kern.dll在哪裏編譯生成的呢?kern.dll動態庫在整個Windows CE6.0中沒有顯式編譯過程,即沒有一個sources文件有kern.dll的編譯過程,所以只能從操作系統的編譯文件Makefile中尋找其編譯過程,我們來看看
WINCE600/PUBLIC/COMMON/CESYSGEN/makefile的如下內容:
從上圖可知kern.dll動態庫是從oemstub.lib編譯而來,而且與nkmain.lib有關,也可以知道kern.dll的入口函數是NKStartup函數。
3.Kitl.dll
包含特定平臺下的KITL支持,在/SRC/KITL的目錄下編譯生成,sources文件中的一部分信息如下:
SYNCHRONIZE_DRAIN=1
RELEASETYPE=PLATFORM
TARGETNAME=kitl
TARGETTYPE=DYNLINK
DLLENTRY=KitlDllMain
DEFFILE=