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=

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