ITPub博客

首页 > Linux操作系统 > Linux操作系统 > (原创)只争朝夕,WinCE快速启动有窍门

(原创)只争朝夕,WinCE快速启动有窍门

原创 Linux操作系统 作者:潘八妹 时间:2009-06-23 19:28:22 0 删除 编辑

【IT168 专稿】http://tech.it168.com/a2009/0513/276/000000276195.shtml

快速启动对于嵌入式消费电子产品是比较重要的要求之一。我这次负责的项目是一个嵌入式消费电子产品的开发,系统用的是ARM处理器+WinCE平台。但每次WinCE启动的时候都非常慢,这对客户来说显然是不能忍受的,为此开发团队经受着公司的巨大压力。

  为什么会出现这种情况呢?经过几个晚上通宵达旦的加班分析和研究,原来主因是系统的引导过程、内核加载和硬件关键时延因素太多导致速度缓慢。本文通过对以上因素进行分析,并提出相应的解决办法。但由于启动速度非常依赖于硬件平台,而且有的方法互相排斥,因此在具体应用时需要综合考虑和选择。

  1.WindowsCE启动慢原因分析

  (1)系统启动加载慢
  嵌入式系统在启动时一般需要三个基本元素:引导工具BootLoader,内核加载和初始化进程等。如果要它成为完整的操作系统,还得加上硬件驱动程序、硬件接口程序和应用程序组。因此,即使在一个简单的嵌入式系统里,系统启动时都需要加载内核和加载许多组件或驱动程序。

  因此,WinCE启动快慢和WinCE系统里面引导初始化时间、内核加载时间、驱动程序加载时间、组件加载时间和应用程序加载时间有直接关系。也就是说,在启动的时候,一方面系统会花一部分时间在内核的的处理上,例如引导初始化和内核初始化。另一方面,启动组件和驱动程序也需要花费一定的时间,例如基本的驱动程序或自运行的程序等。

  (2)硬件关键时延因素太多
  一般来说,嵌入式设备的启动速度与硬件的选择也是很有关系的,如CPU内存的选择。例如在处理器方面,低端的如ARM7根本跑不了WinCE,而且有些ARM9跑起来也会比较慢。另外,非易失闪存的合理选择也是一个重要的影响因素,如选择NOR Flash还是Nand Flash,而且和Nandflash的驱动是否进行优化也有很大的关系。

  2.WinCE启动过程详细分析

  一般来说,Windows CE的启动一般由两部分构成:引导初始化和操作系统执行环境的初始化。其中引导初始化一般也由两部分构成:第一部分是板级、片级初始化,主要是通过设置寄存器初始化硬件的工作方式,如设置时钟、中断控制寄存器等,完成内存映射、初始化MMU等。第二部分是加载程序,将操作系统内核和应用程序的映像从只读存储器加载或者拷贝到系统的RAM中并执行。

(1)BootLoader的启动原理
  在Windows CE系统中,整个系统的加载启动任务由BootLoader来完成,BootLoader是在操作系统内核运行之前运行的一段小程序。通过这段小程序,可以初始化硬件设备、建立内存空间的映射图,从而将系统的软硬件环境带到一个合适的状态,为调用操作系统内核准备好环境。引导程序完成自己的任务后,就将控制权移交给内核。通常引导程序是放置在不易丢失的快闪存储器的开始地址或者是系统冷启动时PC寄存器的初始值。

  (2)内核启动加载过程
  WinCE并不是一个通用的安装版操作系统,在各种嵌入式硬件设备中,一款CE系统通常只会针对某一种硬件平台生成。在整个系统启动时BootLoader通过不同的方式加载CE的内核文件nk.bin。Boot Loader按照WinCE启动方式的不同可分为两大类:一类是下载模式,一类是本地启动模式。当Boot Loader把nk.bin解压到RAM后就把CPU控制权交给CE内核。

  本地启动模式也称为自主模式,即 BootLoader 从目标机上的某个固态存储设备上将操作系统加载到 RAM 中运行,整个过程并没有用户的介入。而下载模式则是目标机上的 BootLoader 将通过串口连接或网络连接等通信手段从主机(Host)下载文件。因此,选择不同的加载方式是会直接影响内核的启动加载时间的。

  在实现初始化硬件的启动时,在BootLoader目录下会发现一些.s文件,这样的文件是CPU加电后最先执行的代码。接着Oal.exe通过Startup函数完成硬件的初始化。该函数一般是使用汇编语言编写,与CPU关系非常紧密,能完成初始化CPU、内存等核心硬件。在系统硬件初始化完毕之后,Startup调用OALStartUp函数,OALStartUp函数主要完成将OEMAddressTable表传递给内核,然后调用KernelStart函数跳转到内核。在StartUp 函数初始化CPU等核心硬件并跳转到Main函数后,系统就会转入C语言代码执行环境。

  然后,BootLoader在平台调试完毕后可以在不用人工干预的情况下自动加载CE内核了。CE映像文件通常叫做nk.bin,它是Windows CE二进制数据格式文件,不仅包含了有效的程序代码,还有按照一定规则加入的控制信息。当然,也可以选择生成.sre格式的代码文件,但是相于对前一种格式,它的代码要长很多,所需要的下载时间也更长。

  (3)WinCE注册表在启动过程的作用
  在WinCE中注册表扮演着非常重要的角色。与桌面Windows一样,Windows CE注册表(Registry)也是一个系统数据库,用来保存应用程序、驱动程序、用户的设定以及其它一些系统的配置信息,通常还存储着操作系统运作和调用程序的状态信息。

一般来说,注册表记录着所有应用程序和硬件外设的驱动信息。因此,在启动过程中系统需要读取注册表的信息。WinCE注册表提供了两种实现方式:基于RAM的注册表(RAM-Based Registry)和基于Hive的注册表(Hive-Based Registry)。注册表实现类型对于用户和应用程序来说是透明的,但是采用不同的类型会影响Windows CE的启动顺序和启动速度。

  基于RAM的注册表方式的缺点是需要两次启动,在启动过程中必须多一次热启动才能使恢复的注册表有效,因此效率相对比较低。而基于Hive的注册表是让人很兴奋的事情,因为基于Hive技术时启动系统会自动加载数据,免去了热启动的麻烦。实际上,也可以认为只有拥有了这样的技术,基于Windows CE的产品才算是一个真正的电脑。基于Hive的WinCE注册表加载过程可分为两部分:boot.hv和system.hv。

  前者是启动时的注册表项,后者是系统注册表项。所以,Hive注册表会先加载boot.hv,把注册表保存所在的存储驱动和文件系统先加载;然后再加载system.hv,也就是从磁盘上去读系统的注册表项。在启动时加载boot.hv的标签是HIVE BOOT SECTION 和END BOOT SECTION。

  因为Boot Hive和System Hive可能有重复的地方,所以可能会重复加载了驱动或重复启动了应用程序。为此,Windows CE允许在描述驱动程序的注册表信息中加入防止重复的标志。因此,在启动过程中,当对WinCE注册表处理不当时就会需要花费不少的启动时间。

  3.加快启动WinCE的策略和方法

  为什么有些WinCE系统能够启动得特别快呢,是有加速的策略和方法吗?答案是肯定的。只要经过精心的调试,加快WinCE启动是完成有可能的。简单说就是“精简系统,按需加载”,也就是以精简和合理的加载顺序和加载内容来加快系统的启动。

  (1)选择合适的WinCE内核的运行类型
  WinCE可以在NOR Flash上直接运行,也可以加载到内存中运行。直接运行是把内核的可执行映像烧写到Flash上,这样就能快速启动一个应用程序。而内核加载方式是把内核的压缩文件存放在Flash上,启动时先解压,再执行。

(2)精简内核体积,做到最小化系统
  在调试过程中,我们发现WinCE启动慢的主要原因是从NAND FLASH中加载内核到内存特别慢,这几乎占了99%的时间,而加载完内核后的启动其实是挺快的。所以要缩短启动时间,可以通过缩小内核来实现。也就是说,在不删除必要组件的前提下必须减小内核文件体积。要减小内核文件体积可以在定制内核向导中选择自定义,也就是说对于每个组件都由自己来选择,而不是选择标准配置。同时,减小内核文件体积最有效最直接的办法是缩小字体,尤其对于东亚字体,采用字体压缩技术并且选择合理的字库文件将明显缩小文件体积。

  (3)精简加载内容,以最小化配置来启动系统
  在启动WinCE时,我们还发现慢的原因是内核在启动时会有许多静态和延迟加载依赖项,尤其是各种安全性 DLL,无疑这些加载项会增加启动时间。因此,要想减小启动时间的首要规则是尽量以精简原则来启动系统。例如设备上的外壳程序或启动时的界面等。

  当我们着手删除许多对启动无关的组件配置项后,只根据需要的配置来启动内核时,我们就会发现实际上内核映像还是能够启动。因此,使启动速度加快的一个重要窍门,是在设备能正常启动和应用的情况下,以最少数量的组件和驱动来启动系统。

  (4)优化系统,以最小化加载驱动和自启动程序
  在调试中我们还发现,启动时间较小是因为着启动时加载较少的驱动程序、设备和自启动程序。因此,如果尽可能的以最小化来加载设备驱动和启动程序是一个很好的方法。以此方式来优化系统中由于加载造成延时,或取消不必要的长时间延迟。

  (5)选择合理闪存类型和优化闪存驱动
  NOR和NAND是现在两种主要的非易失闪存技术。对于存储少量的代码,NOR闪存更适合,而NAND则是高数据存储密度的理想解决方案。NOR的特点是芯片内执行(XIP),应用程序可以直接在Flash闪存内运行,不必再把代码读到系统RAM中。NOR的读速度比NAND稍快一些,而NAND的写入速度比NOR快很多。

  NAND能提供极高的单元密度,但在使用NAND时必须先写入驱动程序,而且向NAND写入信息需要相当的技巧,因为绝不能向坏块写入,这就意味着在NAND上自始至终都必须进行虚拟映射,也就可能会产生额外的时间花费。但如果能对NAND驱动进行合理的优化,则也能收到很好的效果。

  总而言之,快速启动系统是开发WinCE系统第一步。因为只有一个快速启动而又稳定工作的系统,才能够避免客户长时间等待的烦燥,又能够满足客户极速爽快的体验需求,才能最终使嵌入式电子产品得到客户的好评。

来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/12325938/viewspace-607334/,如需转载,请注明出处,否则将追究法律责任。

请登录后发表评论 登录
全部评论
暂无介绍

注册时间:2007-12-28

  • 博文量
    8
  • 访问量
    374401