Windows CE60启动过程分析
在Windows CE 60中,内核(Kenerl)和OEM代码被分成oalexe、kerneldll和kitldll三个部分,其中启动代码(startup)和 OAL层的实现部分不再与内核链接生成NKexe,取而代之的是启动代码(startup)和硬件相关且独立于内核的OAL层的实现部分编译成 oalexe,而与内核相关且独立于硬件的OAL层代码包含在kerneldll中;内核无关传输层(KITL)的支持代码从OAL层分离出来编译成 kitldll。
从表面上看,好像只是代码重新组合了一下,从帮助 文档中BSP的移植过程看好像也是这么一回事,实际上,整个Windows CE 60内核布局发生了很大的改变。Windows CE 60的启动过程也是如此,如果你想按照Windows CE 50的启动顺序去分析Windows CE 60的启动顺序,可能会走到一个死胡同。主要是因为Windows CE 60在启动过程中调用了kerneldll和kitldll两个动态链接库的原因,而且Windows CE60不再编译生成KernKitlProfexe内核文件。
从Windows CE 60的帮助文档可以看出,WinCE60的启动只与oalexe和kerneldll有关,至于kitldll,只有将 *** 作系统编译成具有 KITL功能时才用到。分析Windows CE 60的启动过程实际上找到编译oalexe和kerneldll的源码位置。
首先看一下将WinCE60编译成诸如 WinCE50所说的基本内核情况,即kernexe。对于oalexe源码位置比较容易找到,因为oalexe是启动代码与硬件相关的OAL层 实现文件编译而成,所以只需在BSP的OAL目录中便能找到。而对于kerneldll,在BSP目录结构中,基本上无法找到kerneldll的编 译文件,所以必须从其他方面着手。
下面为WinCE 60的编译日志输出文件:makeimgout在文件复制过程的一部分:
Copying E:\WINCE600\OSDesigns\xsbase270\xsbase270\RelDir\XSBase270_ARMV4I_Release\oalexe to E:\WINCE600\OSDesigns\xsbase270\xsbase270\RelDir\XSBase270_ARMV4I_Release\nkexe for debugger Copying E:\WINCE600\OSDesigns\xsbase270\xsbase270\RelDir\XSBase270_ARMV4I_Release\kerndll to E:\WINCE600\OSDesigns\xsbase270\xsbase270\RelDir\XSBase270_ARMV4I_Release\kerneldll for debugger
从日志输出文件可以看出,在文件复制过程 中,WinCE60编译器将oalexe更名为nkexe,而将kerndll文件更名为kerneldll,也就是说,kerndll文件 的实现部分就是kerneldll的实现体。根据前面的分析,oalexe是与硬件相关独立于内核的OAL层的实现部分,而kerneldll为内 核相关独立于硬件的OAL层的实现部分。同样可以从最后整合后的二进制配置文件cebib文件中看出端倪。
; @CESYSGEN IF CE_MODULES_NK
nkexe E:\WINCE600\OSDesigns\xsbase270\xsbase270\RelDir\XSBase270_ARMV4I_Release\oalexe NK SHZ
kitldll E:\WINCE600\OSDesigns\xsbase270\xsbase270\RelDir\XSBase270_ARMV4I_Release\kitldll NK SHZ
kerneldll E:\WINCE600\OSDesigns\xsbase270\xsbase270\RelDir\XSBase270_ARMV4I_Release\kerndll NK SHZ
; @CESYSGEN ENDIF
而kerndll动态库在整个Windows CE60中没有显式编译过程,即没有一个sources文件有kerndll的编译过程,所以只能从 *** 作系统的编译文件Makefile中寻找其编译 过程。下面看一下$(_PUBLICROOT)\common\CESYSGEN\makefile中的部分内容:
nk::$(NK_COMPONENTS) $(NK_REPLACE_COMPONENTS)
@copy $(SG_INPUT_LIB)\oemstubpdb $(SG_OUTPUT_OAKLIB)
@copy $(SG_INPUT_LIB)\oemstublib $(SG_OUTPUT_OAKLIB)
set TARGETTYPE=DYNLINK
set TARGETNAME=kern
set RELEASETYPE=OAK
set DLLENTRY=NKStartup
set DEFFILE=NO_DEF_FILE
set TARGETLIBS=
set SOURCELIBS=%%NKLIBS%% $(SG_INPUT_LIB)\nkmainlib $(SG_INPUT_LIB)\fulllibclib
$(MAKECMD) /NOLOGO NOLIBC=1 kerndll
从上述代码中可以发现,原来kerndll动态库是从oemstublib编译而来,而且与nkmainlib有关。
在理顺了上述文件的相互之间的关系之后,再来分析Windows CE 60的启动过程可能就比较容易啦。
在理清了上述文件的关系之后,便可以分析任意一款基于ARM微处理器的Windows CE 60的启动过程,现在以深圳亿道电子技术有限公司开发的基于PXA270 ARM开发平台为例,分析Windows CE 60 *** 作系统启动过程。
1、Startup函数:
从Windows CE 60的帮助文档可以看出,WinCE60的启动只与oalexe和kerneldll有关,至于kitldll,只有将 *** 作系统编译成具有 KITL功能时才用到。分析Windows CE 60的启动过程实际上找到编译oalexe和kerneldll的源码位置。
oalexe的通过Startup函数完成硬件 的初始化。Startups代码与该硬件平台的Bootloader启动代码共用,其中PreInit函数主要完成将ARM处理器工作模式切换到管理员 模式、同时关闭MMU,并检测系统启动原因,如果是热启动、即在该函数调用之前已经启动了Bootloader程序,相当基本硬件初始化已经完成,则直接 跳转到OALStartUp函数中;否则需要进行硬件中断屏蔽、内存、系统时钟频率、电源管理等硬件的基本初始化过程。(具体过程见代码的分析)
写一个后台程序监听消息,当插入或者拔出sd卡的时候系统会有一个WM_DEVICECHANGE消息产生。
简单示例:
LRESULT OnMessage(UINT uMsg,WPARAM wParam,LPARAM lParam)
{
if(uMsg == WM_DEVICECHANGE)
{
//插入或者拔出,消息一样 wParam的值不一样
}
}
自己查查 PeekMessage TranslateMessage DispatchMessage等的用法
以上就是关于wince6.0启动异砦新手求助全部的内容,包括:wince6.0启动异砦新手求助、请问wince如何在插入SD卡的时候自动启动卡上面的一个程序、等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)