Windows CE 6.0的内核启动顺序

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
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值