http://liwyylh.blog.163.com/blog/static/635429132008028054482/
分析WinCE5.0的启动过程对了解和掌握Windows CE操作系统比较重要,下面主要分析Win CE5.0的启动过程,在后续的文章中将分析WinCE6.0的启动过程。
1、CPU加电,跳转到复位向量;
2、执行引导程序Startup();OAL中的Startup();
• 完成最小的CPU和硬件初始化;
• 关闭中断、缓存(Cache)和内存管理单元(MMU);
• 调用内核启动函数KernelStart
3、执行KernelStart();
• 初始化OEMAddressTable内容中第一级存储器页表;
• 打开MMU和Cache;
• 为每一种操作模式初始化堆栈;
• 依次调用ARMInit、KernelInit、FirstSchedule
4、ARMInit()内核主要初始化函数,负责调用OEM提供的初始化函数
• 调用OEMDebugInit初始化调试串口;
§ InitDebugSerial()
§ OEMWriteDebugByte()
§ OEMReadDebugByte()
§ OEMWriteDebugString()
• 调试串口显示WinCE消息;
• 调用OEMInit初始化目标硬件平台;
§ 中断初始化-OALIntrInit();
§ 系统计时器初始化-OALTimerInit();
§ KITL接口初始化-OALKitlStart()
5、KernelInit() 封装了所有的内核初始化,是内核初始化的入口,通过调用不同的内核初始化函数初始化内核组件;
• 堆栈初始化-HeapInit();
• 内存池初始化-InitMemoryPool();
• 内核进程初始化-ProcInit();
• 初始化内核调度器-SchedInit();并创建SystemStartupFunc线程;
6、FirstSchedule函数启动调度器
• SystemStartupFunc函数通过执行IOCTL_HAL_POSTINIT给OEM最后一个完成其他内核初始化;
• IOCTL_HAL_POSTINIT由OEMIOControl调用
7、内核将查找并运行第一个进程-FileSys.exe
• FileSys.exe是管理文件系统、数据库和注册表的进程。当加载了FileSys.exe后,它将查看RAM中是否存在已初始化的文件系统。
• 如果发现这样的文件系统,FileSys.exe将使用已初始化的文件系统,这将允许CE设备在结束系统的重新启动后能在文件系统中保留数据。
• 如果FileSys.exe没有找到文件系统,它将创建一个文件系统
• FileSys还创建默认的数据库映像和默认的注册表
• 查找在注册表的HKEY_LOCAL_MACHINE/Init键下的值。这个键中值提供了应该作为启动过程的一部分而加载的一组进程的名称、次序及相关性;
• 将要运行的进程由名为“Launch xx”的值指定,这里xx是定义运行次序的数字。一个可选值“Depend xx”可以用来使进程的运行依赖于另一个在这个次序的前面指定的进程。
8、运行设备管理器进程-Device.exe:
• 该模块的作用是加载和管理系统中的可安装设备驱动程序。
• Device.exe加载后,它将观察注册表中HKEY_LOCAL_MACHINE/BuiltIn以查找驱动程序列表,这些驱动程序必须在初始化时加载。
9、运行图像子系统进程-GWES.exe;
• GWES.exe包括了GWES子系统,图形窗口和事件管理器。
• GWES.exe加载三个预定义的驱动程序:键盘驱动、触摸屏驱动、显示驱动。
10、启动并运行定制的Shell应用程序
• explorer.exe:在Explorer.exe初始化了桌面和任务栏窗口后,它将观察 /windows/startup目录,并运行任何包含在这个目录下的可执行文件或快捷方式。
• 没有Explorer嵌入式系统,执行自定义的Shell应用程序
注:几个内核函数的调用位置:
KernelStart-$(_PRIVATEROOT)/WINCEOS/COREOS/NK/KERNEL/ARM/armtrap.s(402)
ARMInit()-$(_PRIVATEROOT)/WINCEOS/COREOS/NK/KERNEL/ARM/mdarm.c(467)
KernelInit() -$(_PRIVATEROOT)/WINCEOS/COREOS/NK/KERNEL/kwin32.c(1125)