WINCE6.0的oal.exe、kernel.dll和kitl.dll如何编译生成

WINCE6.0中,内核(kernel)OEM代码(OEM code)被分成三部分:oal.exekernel.dllkitl.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=

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章