Windows CE 6.0以前的WinCE版本,系统进程和应用程序的启动顺序通过设置注册表项HKEY_LOCAL_MACHINE/Init下的子键来完成,并且内核启动过程把filesys.exe作为第二个进程(第一个进程为NK.exe),而对于Windows CE 6.0,大部分系统进程变成了动态链接库(DLL)的形式装载在内核进程中,系统采用一种同时支持动态链接库(DLL)和可执行文件(.exe)的机制。
1
、进程启动顺序的配置
虽然我们可以通过设置注册表项
HKEY_LOCAL_MACHINE/Init下的子键来控制系统进程和应用程序的启动顺序,但一般包括下面启动进程
(1) 调试shell (Shell.exe)
Shell.exe 是运行在开发平台且与目标控制服务进行通信的进程,为了运行KITL进行开发和调试,在运行镜像中必须包含和启动shell.exe进程.该进程的作用是在使用目标控制工具传输Windows CE镜像后,在Windows CE 的命令提示窗体显示命令提示。该进程只有在编译镜像选项中选中Enable KITL时才编译到运行镜像。
(2)、设备管理器(device.dll)
(3)、图像(
Graphics)、窗体(
Windowing)和事件子系统(
Events Subsystem)(gwes.dll)
gwes.dll除了包括上述三种内容外,还包括装载和初始化如键盘、触摸屏等输入设备
(4)、explore.exe
下面为common.reg注册表中有关启动键HKEY_LOCAL_MACHINE/Init中的部分内容
;
@CESYSGEN IF CE_MODULES_SHELL
IF
IMGNOKITL !
[HKEY_LOCAL_MACHINE/init]
"Launch10"="shell.exe"
ENDIF
IMGNOKITL !
;
@CESYSGEN ENDIF
;
@CESYSGEN IF CE_MODULES_DEVICE
[HKEY_LOCAL_MACHINE/init]
"Launch20"="device.dll"
;
@CESYSGEN IF CE_MODULES_SHELL
IF
IMGNOKITL !
[HKEY_LOCAL_MACHINE/init]
"Depend20"=hex:0a,00
ENDIF
IMGNOKITL !
;
@CESYSGEN ENDIF
;
@CESYSGEN ENDIF
;
@CESYSGEN IF CE_MODULES_GWES
[HKEY_LOCAL_MACHINE/init]
"Launch30"="gwes.dll"
"Depend30"=hex:14,00
;
@CESYSGEN ENDIF
;
@CESYSGEN IF CE_MODULES_BTGW
;
@CESYSGEN ENDIF
;
@CESYSGEN IF CE_MODULES_SERVICES
[HKEY_LOCAL_MACHINE/init]
"Launch60"="servicesStart.exe"
"Depend60"=hex:14,00
;
@CESYSGEN ENDIF CE_MODULES_SERVICES
下图深圳亿道公司EELiod开发平台运行在具有KITL模式下的注册表截图。
无KITL模式下的注册表截图
其中:
Launchxx:Windows CE进程的启动顺序执行键
Dependxx :列出与前面所加载进程相关的顺序号
截图中explore.exe进程的顺序执行键为Launch50,依赖键"Depend50"=hex:14,00, 1e,00,表明explore.exe进程必须在device.dll和gwes.dll进程完全启动之后才能启动。
2
、内核进程的启动顺序
虽然Windows CE6.0以前的版本也将内核进程NK.exe作为Windows CE 启动的第一个进程,但他们调用函数的过程还是具有一定的差别(具体参考Windows CE 5.0和Windows CE 6.0的启动分析部分)。下面为Windows CE 6.0的函数调用顺序。执行步骤由上到下执行。
函数名
|
所在位置
|
描述
|
StartUp
|
Nk.exe/OEM代码
|
执行目标平台硬件初始化
.
|
KernelStart
|
Nk.exe/nkldr.lib
|
启动入口,初始化内全局变量、设置页映射、查找内核入口
NKStartup的位置并跳转到入口
|
NKStartUp
|
Kernel.dll
|
CE 内核启动代码,设置KData启动参数
|
OEMInitGlobals
|
Nk.exe/oemmain.lib
|
交换内核和
OEM全局变量指针 g_pOemGlobals 和g_pNKGlobals.
|
其他内核传输化
|
Kernel.dll,
|
执行其他内核初始化,包括和
KITL交换全局变量.
|
OEMInitDebugSerial
|
Nk.exe/ OEM代码
|
进入内核后首次调用
OEM代码,完成调试串口初始化。
|
OEMInit
|
NK.exe/ OEM代码
|
初始化特定
BSP的硬件平台.
|
KernelFindMemory
|
Kernel.dll
|
确定可用内存大小
|
KernelInit
|
Kernel.dll
|
调用第一个线程前的最后内核初始化:
APICallInit:API函数集初始化
HeapInit: 初始化内核堆
InitMemoryPool: 初始化内存池
PROCInit: 初始化进程支持
VMInit: 虚拟内存初始化
THRDInit: 初始化线程支持
MapfileInit: 初始化支持文件映射
|
FirstReschedule
|
Kernel.dll
|
调度第一个线程
SystemStartupFunc.
|
SystemStartupFunc
|
Kernel.dll
|
内核最后初始化
|
OEMIoControl(..., IOCTL_HAL_POSTINIT, ...)
|
Nk.exe/ OEM代码
|
内核初始化完毕后第一次调用
OEM
|