微波EDA网,见证研发工程师的成长!
首页 > 硬件设计 > 嵌入式设计 > Windows CE 6.0 Multi-bin的设计与实现

Windows CE 6.0 Multi-bin的设计与实现

时间:03-06 来源:电子技术应用 点击:

Windows CE是微软推出的一款32位的嵌入式操作系统。它具有良好的多媒体功能和友好的人机交互界面,支持PowerPC、X86、ARM和MIPS等多个系列处理器的体系结构,并为所支持的处理器提供完善的系统库[1]。它还提供了完善的设备驱动程序和软件开发包,大大缩短了开发周期,节约了电子智能产品的上市时间。在这些产品开发过程中,系统启动时间的时延是影响客户体验(QoE)的重要因素。启动速度受很多因素的影响,包括定制系统镜像文件的大小、系统内核加载驱动的多少、内存占用的大小等。为了减少系统启动时延,目前比较流行的做法是在Bootloader中添加LOGO启动画面,从而在视觉上降低客户的时延感受[2]。从本质上讲,这种方法并没有从根本上减少系统的启动时延,仅仅是从视觉的角度转移了客户的注意力。

本文在分析Windows CE 6.0系统启动过程的基础上,设计了一种在Bootloader中实现BinFS文件系统进而完成Multi-bin加载的方法,从而真正达到缩短启动时间的效果,同时还为用户节省了大量的内存空间。实验结果表明,该方法性能稳定,可移植性强,并已经应用到一款基于Samsung 2440处理器的IPTV手持式测试仪系统上。

1 Windows CE系统启动过程

Windows CE系统启动过程如图1所示。


在Windows CE操作系统中,当基于Windows CE的目标设备上电启动或者复位时,系统首先加载并运行Bootloader程序,Bootloader程序进行必要的硬件初始化,然后通过Bootloader再加载并启动操作系统内核映像。启动操作系统内核的过程实际上就是加载并运行OAL(OEM Adaptation Layer)程序的过程。OAL是Windows CE操作系统内核的重要组成部分,OAL并不能被单独加载并运行,它最终被编译进操作系统内核,从而通过操作系统内核存在并发挥作用,操作系统的启动过程就是一个加载并运行OAL程序的过程[3]。

系统从启动加载内核映像文件到最后的显示桌面会有一段时间,这个时间段就是通常所说的启动时延。通常情况下为10 s~13 s。为了缩短这段时延,可以将系统映像分为多块,将系统核心启动部分的内容放到内存中,其他部分放到固态存储器(如Nand Flash)中,使用BINFS文件系统读出。即在系统启动过程中,先加载操作系统内核映像的核心部分,而操作系统内核映像的其他部分仍然驻留在Nand Flash中,需要时再从Nand Flash中进行加载,从而大大减少开机读取系统的时间。同时,也不再需要为操作系统预留全尺寸的内存空间,而只需预留最小开机核心部分的内存空间,剩下的作为通用内存空间。这样就使得操作系统内存的使用有了很大灵活性,同时可用系统内存大大增加。从而,在根本上达到了按需加载系统模块到内存的要求。这就是所谓的Multi-bin技术。

2 Windows CE .bin镜像文件解析与下载

由Windows CE的开发工具Platform Build编译生成的Windows CE操作系统及Bootloader的镜像文件主要有两种格式类型:以.bin为文件名后缀的记录型镜像文件和以.nb0为后缀的原始型(raw)镜像文件。前者以记录(Record)为单位组织镜像的数据,后者则是镜像在嵌入式系统中运行时的二进制数据快照。其中,.bin文件是一个描述性质的镜像文件,它由文件头(Head)、镜像数据目的起始地址(ImageStart)、镜像数据长度(ImageLength)和多条相对独立的记录(Record)构成。本文以实现Multi-bin的操作系统xip.bin为例进行分析,使用UltraEdit将其打开,如图2所示。

从图2可以看出,文件头(head)由7个字节组成,内容是:42 30 30 30 46 46 0A,即"B000FF\x0A",这是判断镜像文件是.bin类型的依据。镜像数据目的起始地址(ImageStart,00 00 07 80)由4个字节组成,它定义了镜像文件解析后装载在内存中的起始地址是0x80070000。镜像数据长度(ImageLength,68 07 13 02)也由4个字节组成,它表示.bin镜像文件解析后在内存中占用的总的存储空间大小为(0x02130768)。每条记录(Record)由4字节的起始存储地址(RecordStart)、4字节的数据长度(RecordLength)、4字节的校验码(RecordCheckSum)和RecordLength个字节的记录数据(RecordData)组成。以第一条记录(阴影部分)为例,分别为0x80070040、0x00000008、0x000001E3和0X8007004C434543454。

由以上.bin的文件格式可知,.bin文件不是内存程序空间的一个简单的拷贝,所以它不能直接用串口烧写进内存或FLASH空间来直接运行,必须通过EBOOT按照.bin文件的格式解析出来具体的内容重新装载后才能运行[4]。对于xip.bin的下载流程如图3所示。

3 BinFS的实现

3.1 BinFS简介

二进制ROM映像文件系统(BinFS)是一个读取由romimage.exe产生的二进制映像(.bin)文件格式的文件系统。BinFS可以分析每个区域(Region)中的.bin文件记录,这些.bin文件记录,最终用户是无法看见的。.bin文件以特定的片段(Section)组织数据,每个片段包含一个片段头,片段头定义了这个片段的起始地址、片段长度及校验和。Romimage.exe将以逻辑片段组织的数据写到.bin文件中。

本文所采用的硬件平台使用Samsung K9F1208U0B 64 MB的DDR SDRAM作为程序运行的内存,使用K9F-
1208UOM的64 MB Nand Flash作为保存Windows CE操作系统映像的存储器。由于使用的是64 MB的Nand Flash存储器,而最终的Release(发布版)Windows CE操作系统映像的大小在32 MB左右[5],因此,如果将整个Flash存储器只用来存储操作系统映像文件,将无疑是一种巨大的浪费。一种经济、合理的做法是将整个Flash分为两部分,一部分是BinFS文件系统,用于保存Windows CE操作系统的多个映像文件(支持Multi-bin);另一部分为FAT文件系统,用于保存其他用户文件。采用这种方法,操作系统裁剪的越小,留给用户的存储空间就越大[6]。这一方案的实现需要BinFS文件系统的支撑。

3.2 BinFS的实现

Bootloader管理着目标设备初始化、下载运行时映像和引导运行时映像的启动过程。在操作系统开发过程中,使用Bootloader可以快速地将一个运行时映像下载到目标设备,节约开发时间。如果Bootloader支持BinFS,则这个Bootloader是可以分区和格式化的,并且它可以把数据写进存储设备。

为了实现这个分区,Bootloader使用bootpart.lib静态库函数产生一个BinFS分区和一个外部扩展分区。Bootpart支持库将FMD的代码从Bootloader中抽象出来,在进行分区时,完成对Flash的低级格式化。也可以通过指定字节的偏移完成对分区指定长度的读或写。

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top