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