到这里获得更好阅读效果: http://groups.google.com/group/wince_cn/web/%E5%86%85%E6%A0%B8%E5%90%AF%E5%8A%A82
此前,我们知道了内核启动之前的整个过程.按照这个指导,可以完成oal的设计.整个过程的简要回顾如下:
StartUp()
KernelStart() / KernelInitialize()
<Main kernel initialization function>
OEMInitDebugSerial()
OEMInit()
KernelInit()
HeapInit()
InitMemoryPool()
ProcInit()
SchedInit()
FirstSchedule()
SystemStartupFunc()
IOCTL_HAL_POSTINIT
接下来,内核怎么运行的?在FirstSchedule之后发生了什么?
SystemStartupFunc()
KernelInit2();
Load:coredll.dll
OEMIoControl();
InitWatchDog ();
CreateThread:PowerHandlerGuardThrd
Load:shimeng.dll
CreateThread:CleanDirtyPagesThread
CreateThread:RunApps
Endless While(1):AlarmThread
OEMIoControl()会透过IOCTL_HAL_POSTINIT命令字调用OAL函数,这给了OEMs最后的机会执行其他初始化工作.
InitWatchDog()会初始化看门狗.默认的情况下,ce不会使用硬件看门狗,而是利用系统tick来设计一个’伪’看门狗功能.如果想使用硬件看门狗指定,需要更改位于privatewinceoscoreos
kkernelwatchdog.c文件里面的一个指针变量
void (* pfnOEMRefreshWatchDog) (void) = FakedRefreshWatchDog;
将上面的函数指针重新赋值到自定义的看门狗更新函数.
PowerHandlerGuardThrd是一个优先级为1的线程(最高线程优先级).它不停的等待事件hEvtPwrHndlr,然后调用__debugbreak()函数.我认为这是一个电源监控保护线程,配合电源管理,比如低压,掉电时候可以触发事件hEvtPwrHndlr.来启动这个保护线程.
Shimeng.dll是一个Shim engine.源代码位于PRIVATEWINCEOSCOREOSNKVERIFIER.它可以拦截对内核的系统调用,象是隔离应用程序或者第三方dll与内核之间的一个’垫子’.它配合加载器(loader)工作.loader加载一个exe或者dll时候都会通知shim engine,然后shim engine去检查注册表[HKLMshimengine],看看是否此exe或者dll需要被shim隔离. Douglas Boling在Using the Windows CE and Windows Mobile 5.0 Application Verifier一文中涉及到对shim engine技术的应用.
CleanDirtyPagesThread线程是一个idle优先级的线程,当所有初始化结束,它将清除一些remain memory.
AlarmThread是一个Low Memery警告监控线程.当上诉所有任务完成,系统将自己的优先级降低到idle级别,进入一个死循环.这相当于一个idle的线程,在这个线程里面会等待hAlarmThreadWakeup事件.在HoldPage()会设置这个事件,此后,系统将进行换页等动作改善低内存状态. 相关链接:http://groups.google.com/group/wince_cn/web/%E5%86%85%E6%A0%B8%E5%90%AF%E5%8A%A82 |