在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=