基于Intel PXA270的Windows CE5.0下Boot Loader实现

来源:互联网 发布:阿里旺旺旧版本mac 编辑:程序博客网 时间:2024/06/05 15:32

作者:重庆邮电大学 刘扬 田增山 凌顺 周永胜

日期:2007-05-01 00:00:00

 

Windows CE.NET是微软公司向嵌入式领域推出的一款操作系统,被广泛应用于平板电脑、数码相机、彩屏手机、PDA等许多产品当中。


Windows CE的开发过程可以分为:0AL(OEM Abstraction Layer)、驱动、应用程序开发三个步骤。其中,0AL开发是Windows CE开发过程中最基本的一步,而Boot Loader设计在0AL开发中又具有极为关键的作用。因此,本文以Windows CE 5.0在Xscale PXA270处理器上的Ethernet Boot Loader的设计和实现为例,对Boot Loader的实现进行阐述,并分析Boot Loader的架构、启动控制流程和配置安装。


对于Windows CE嵌入式操作系统来说,系统加电后第一条指令就是Boot Loader的代码。Boot Loader通常位于目标设备上的非易失存储设备中(如Flash),并且在系统加电或重置时自动执行。通常可以通过JTAG或串口工具把Boot Loader烧写到目标设备上,Boot Loader的唯一目标就是加载并执行操作系统映像。


在嵌入式应用系统最终产品化后,Boot Loader将不是必须的。因为Windows CE不仅提供了利用Boot Loader加载系统的启动方式,而且提供了通过启动向量ResetVector 加载系统的启动方式。但在系统开发阶段,Boot Loader是必须的,它将使开发更加方便高效。


硬件平台架构


处理器采用英特尔的XScale PXA270系列处理器,可以配合2700G多媒体加速器,提升高分辨率图像处理和3D加速处理能力。硬件开发板的外设包括外部存储器、串口和DM9000AE 100Mb以太网接口芯片。

Boot Loader的体系结构


一个典型的以太网Boot Loader由Blcommon、OEM代码(针对不同硬件平台需要修改代码)Eboot和网络驱动程序等部分组成组成,如图1所示。

图1  Boot Loader框架结构


● Blcommon库


BLCOMMON库提供了丰富Boot Loader基本功能,包括复制Boot Loader到RAM 以便高速运行,解析  .bin文件,控制系统加载过程等等。代码库一般放置在%_WINCEROOT% /PUBLIC/COMMON/OAK/DRIVERS /ETHDBG/BLCOMMON。其主要文件为blcommon.c。


● OEM代码


OEM代码是与设备初始化及硬件扩展有关的代码,位置在%_WINCEROOT% /PLATFORM/<平台名称>/SRC/BOOTLOADER/ EBOOT。


● EBoot库


Eboot库提供了DHCP、TFTP和UDP服务。BooLoader与Platform Builder建立TFTP连接.并下载系统镜像。其中TFTP用于从开发工作站的Platform Builder下载Windows CE操作系统镜像(这是本文所使用的加载调试方式)。Eboot库代码位于%_WINCEROOT% /PUBLIC /COMMON/OAK/DRIVERS /ETHDBG/EBOOT。


● 网络驱动库


EDBG驱动程序库集成了一些常见以太网驱动,为Bootloader和操作系统访问提供了通用接口。Boot Loader利用这些接口下载Windows CE运行时映象,操作系统利用这些接口实现与Platform Builder的KITL连接。

Boot Loader启动控制流程


由于硬件的差异,Boot Loader的功能可能不同,图2所示的是Boot Loader的较为通用的启动控制流程。

图2  Boot Loader启动控制流程


● 启动函数StartUp


StartUp函数是Boot Loader的入口函数,在CPU启动后它将立即运行。该函数使用汇编语言编写,完成初始化CPU、内存(包括建立存储器访问和初始化缓存)等核心硬件,其主要完成的功能包括:使CPU进入正确的运行模式,以便CPU 能够访问所有的硬件资源;禁用所有的CPU中断;关闭MMU和TLB;禁用Cache和write Buffer;初始化内存控制器;初始化其他硬件设备,如时钟等;将Boot Loader本身复制到内存中;跳转到C代码中。


实现这些功能的代码一般放置在StartUp.s文件中。由于此处是用汇编语言编写的,有较强的硬件相关性,所以一般参考板的CPU与开发平台的CPU考虑采用相同的架构,这样做可以不需要对寄存器的定义和初始化流程的等进行修改。


● 主控部分Main函数


StartUp函数初始化CPU等核心硬件并跳转到Main函数后,系统转入了C语言代码执行环境。Main函数的主要任务时调用BLCommon中的BootloaderMain()函数。而BootloaderMain()函数是Boot Loader的主控函数,它控制了Boot Loader的完整执行流程。它的主要工作如下。


(1)重定位全局变量函数KernelRelocate(),它将Boot Loader中的全局变量重定位到RAM中。这样做的原因在于Boot Loader是在目标设备的只读媒体上运行的(本实际方案是在NOR Flash上),这样的情况下将使得Boot Loader的代码对全局变量进行读写操作就会失败。所以需要把全局变量所在的数据段移到RAM中,来确保全局变量可写。


(2)初始化调试端口函数OEMDebugInit,主要任务是初始化调试输出用的硬件端口,方便输出调试信息。本方案初始化FFUART(全功能串口)用来输出调试信息,在终端开发机上进行接收。


(3)初始化平台函数OEMPlatformInit(),其作用是初始化目标板上的的设备如实时时钟,显示屏、Flash、网卡等。


(4)预下载函数OEMPreDownloade(),主要任务是完成以太网下载前的一些准备工作,如通过DHCP获得IP地址或者初始化TFTP服务等。


(5)下载映像函数DownloadeImage(),该函数完成从远程开发机上下载操作系统映像。


(6)启动映象函数OEMLaunch。


在实际开发中,本方案利用同属Intel Xscale 270 CPU的MainstoneII开发板进行克隆,这样使得大量的代码可以共享,只需修改少许的OEM代码和实现一些可选的OEM函数即可完成开发,减少未知错误。


Boot Loader通过对以上函数的调用,完成了对操作系统的映像的加载控制,函数的流程及其代码位置如图3所示。

图3  Boot Loader函数调用流程


● Boot Loader的配置


BootLoader程序可以通过PB的集成编译环境编译链接,控制文件为.bib文件,.bib文件主要完成以下工作。


(1)配置目标设备上的内存分配信息,如目标设备上的物理内存起始地址、长度以及用途等;


(2)包含ROM信息,如起始位置、宽度等,这样就可以正确的生成可以在ROM上运行的映像文件;


(3)需要打包文件列表。


对于Boot Loader文件的下载,可以通过仿真器下载,也可以通过其他调试程序下载,本方案采用的是直接烧写到Flash中,因此要得到纯二进制格式的映像以便烧写进Flash。Boot Loader是系统启动后第一个运行的程序,因此它必须放在CPU 上电和复位后立即运行的地址处。Xscale在上电和复位后是从物理地址0x00000000(片选0 Boot Flash的起始地址)开始运行的。

结束语


作为Windows CE操作系统的启动部分,Boot Loader负责把Windows CE操作系统加载到内存中,然后开始执行。虽然最终的产品中可能不含Boot Loader,但是在开发和调试的时候Boot Loader是不可或缺的。只有得到一个稳定工作的Boot Loader程序,才能够更进一步开发Windows CE的BSP,直至最后整个系统的成功。

原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 油反复使用起沫怎么办 炸东西的油黑了怎么办 板栗放久了干了怎么办 三四个月的宝宝拉肚子怎么办 四个月的孩子拉肚子怎么办 4个月孩子拉肚子怎么办 三阳的房子很热怎么办 买了缺角的房子怎么办 多肉摇钱树焉了怎么办 虎皮兰叶子烂了怎么办 三角龙骨烂根了怎么办 地板木龙骨会动怎么办 多肉植物开花后怎么办 春峰之辉烂了怎么办 仙人指不开花是怎么办 大门开在破财位怎么办 人走霉运的时候怎么办 pp助手刷机失败怎么办 别人骂我很难听怎么办 被骂了心里不爽怎么办 被别人扎小人了怎么办 人要倒霉的时候怎么办 属虎的请了貔貅怎么办 我的护身符丢了怎么办 地漏被头发堵了怎么办 淋浴房地漏堵了怎么办 冰箱对着卧室门怎么办 冰箱离灶台太近怎么办 风水财位对着门怎么办 一进大门是厕所怎么办 大门和厕所正对怎么办 房子靠马路很吵怎么办 入户门对着楼梯怎么办 买房买了18楼怎么办 加个房间,没窗户怎么办 厨房窗户对着路怎么办 卧室门正对窗户怎么办 在路上车抛锚了怎么办 村里欠个人的钱怎么办 房子在路边太吵怎么办 楼正对小区大门怎么办