Chinaunix首页 | 论坛 | 博客
  • 博客访问: 280001
  • 博文数量: 85
  • 博客积分: 2500
  • 博客等级: 少校
  • 技术积分: 525
  • 用 户 组: 普通用户
  • 注册时间: 2009-06-12 21:41
文章分类

全部博文(85)

文章存档

2013年(37)

2011年(2)

2010年(3)

2009年(43)

我的朋友

分类: C/C++

2009-07-09 21:03:22

通过前两篇文章的介绍,我们已经知道NBOOT用来引导EBOOT,继而EBOOT加载并引导WinCE操作系统(NK)。那么,WinCE6.0的启动过程又是怎样的呢?本文基于S3C2410的平台做一个详细的分析。需要说明的是,WinCE6.0的整个启动过程对于同一类型的MCU来说大同小异,如S3C2410PXA270同属ARM平台的MCU,所以他们的启动过程是类似的,可以说唯一的不同就在OAL处,而WinCE操作系统的启动正是从OAL开始的。
     
OALOEM Adaptation Layer)即OEM适配层,它的主要作用是在移植WinCE到新的硬件平台时减少操作系统的修改,通俗的说就是为WinCE操作系统抹平MCU的差异,使其能很方便的在不同MCU上运行。所以,OAL包括了和系统硬件通讯的最底层代码。内核则通过OAL跟硬件进行交互。逻辑上,OAL是介于CE内核和设备硬件之间的一个代码层,是一个抽象的概念。物理上,OAL和其他一些库一起链接成可执行文件,在WinCE6.0中对应的文件是OAL.exe,这是OAL的客观存在。WinCE6.0中的OAL跟先前的OAL比,是有一些变化的,它从内核中分离出来成为OAL.exe,而内核则变成了Kernel.dll。这样做的好处是可以单独升级OAL。但整体的OAL结构并没有改变,OEM函数保持一致,OALKernel的接口由共享结构NKGLOBAL实现。这一部分的具体内容下一篇再做介绍。下图所示为WinCE6.0OAL设计。
     
 

在移植WinCE到新的硬件平台时,创建OAL是最复杂的任务之一。一般来说,最简单的方法是拷贝一个跟新的硬件平台类似的且成熟的OAL,然后根据硬件的不同进行修改,使其满足目标硬件的特定要求。这里不展开说明,回头再单独整理。
     
EBOOTOAL.exe的跳转是从OEMLaunch()开始的,函数OEMLaunch()中调用LaunchdwPhysLaunchAddr),它的实现代码如下:

Code

    函数Launch()的参数为物理地址,因为在跳转之前已将MMU关闭。该地址可通过VIEWBIN来查看,如下图所示:
     

     如何确定这个地址对应的是
NK.bin中的哪一个文件呢,先前说是OAL.exe,证据何在。在PB6.0中增加了浏览NK.bin的功能,我们可以利用此功能查看NK.bin的详细情况,如下图所示:     


     从上图中可以看出
0x80205394处对应的是NK.exe,而这里的NK.exe即为OAL.exe
     
至此,我们已经知道EBOOT是如何跳转到OAL.exe中的了。接下来继续看OAL.exe的执行过程。
     
OAL的启动代码如下:

阅读(1023) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~