内核启动之二

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

本版积分规则

99

主题

1078

帖子

0

粉丝
快速回复 在线客服 返回列表 返回顶部