wince 5.0 内核启动顺序(ARM)
Kernel Startup Sequence
Startup()
KernelStartup()
ArmInit()
OEMInitDebugSerial()
OEMInit()
KernelInit()
HeapInit()
InitMemoryPool()
ProcInit()
SchedInit()
FirstSchedule()
SystemStartupFunc()
IOCTL_HAL_POSTINIT
上表是基于ARM 的wince内核启动顺序.
粗体字表示OEM 需要定制的部分.
1. Startup() -> Startup.s
位于%_WINCEROOT%/Platform/<Hardware Platform Name>/Src/Kernel/OAL 目录下
这个函数是bootloader调转到run-time镜像后最先执行的代码,位于我们的BSP开发包中,由OEM定制.程序最后启动KernelStart().
2. KernelStart() -> Armtrap.s (Private)
位于 %_WINCEROOT%/Private/Winceos/Coreos/Nk/Kernel/ARM 目录下
这个函数是内核的Main Entry 点.
3. ARMInit() -> Mdarm.c (Private)
位于 %_WINCEROOT%/Private/Winceos/Coreos/Nk/Kernel/ARM 目录下
这个函数调用4,5来对Main Arm 进行初始化动作.
4. OEMInitDebugSerial() -> Mdarm.c (Private)
位置同上.
初始化串口,调用BSP 包中的串口函数(由OEM定制的部分).
5. OEMInit() -> Init.c
%_WINCEROOT%/Platform/<Hardware Platform Name>/Src/Kernel/OAL
这个位于我们BSP开发包中,由OEM自行定制,不用多说,做过OAL开发的都知道.
6. KernelInit() -> Kwin32.c (Private)
%_WINCEROOT%/Private/Winceos/Coreos/Nk/Kernel 目录下
该函数调用7,8,9,10函数对内进行初始化动作.
7. HeapInit() -> Heap.c (Private)
%_WINCEROOT%/Private/Winceos/Coreos/Nk/Kernel 目录下
初始化内核堆.
8. InitMemoryPool() -> Physmem.c (Private)
%_WINCEROOT%/Private/Winceos/Coreos/Nk/Kernel 目录下
初始化内核内存池
9. ProcInit() -> Schedule.c (Private)
%_WINCEROOT/Private/Winceos/Coreos/Nk/Kernel
初始化内核进程.
10. SchedInit() -> Schedule.c (Private)
_WINCEROOT/Private/Winceos/Coreos/Nk/Kernel
初始化调度管理器(scheduler) ,创建SystemStatupFunc 线程.
11. FirstSchedule() -> Schedule.c (Private)
%_WINCEROOT/Private/Winceos/Coreos/Nk/Kernel
启动调度管理器(scheduler), 调用SystemStartupFunc(),IOCTL_HAL_POSTINIT
12. SystemStartupFunc() -> Schedule.c (Private)
%_WINCEROOT/Private/Winceos/Coreos/Nk/Kernel
当所有内核需要的初始化动作完成之后并且当系统准备启动和运行内核线程,SystemStartupFunc被调用.SystemStartupFunc以IOCTL_HAL_POSTINIT为参数调用OEMIoControl,OEMIoControl,
13. OEMIoControl,这个我也不多说了,由我们OEM定制.
以上为wince 基于ARM cpu 的内核启动的过程.
参考:
1. Microsoft Windows CE 5.0 Board Support Package, Boot Loader, and Kernel Startup Sequence ;
2. WinCE 5.0 内核启动过程 .