DIY编程器网

标题: Windows CE 6.0 Multi-bin的设计与实现 [打印本页]

作者: admin    时间: 2014-10-10 08:49
标题: Windows CE 6.0 Multi-bin的设计与实现
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的低级格式化。也可以通过指定字节的偏移完成对分区指定长度的读或写。

4 Multi-bin的实现

Multi-bin是把内核映像分为“最小内核”(xipkernel.bin)与“系统其他文件”(本文中的nk.bin)。在系统启动时加载的是BinFS分区上的xipkernel部分,它位于xip.bin的起始位置。

4.1 修改Config.bib file的内存段

添加XIPKERNEL区域并且将它的存储属性设置为RAMIMAGE。XIPKERNEL是一个并不存储NK的文件,这里可以将其看成最小系统。设置NK区域的存储属性为NANDIMAGE,这将会阻止NK地址空间被分配为RAM地址。CHAIN是实现Multi-bin的必须部分,其作用是通知系统各bin文件的位置。

当加载带有BinFS的映像时,Nand Flash设备上的Windows CE kernel(内核)重定位到RAM区域,当系统访问该区域时,BinFS负责访问Nand Flash设备上相对应的位置,并返回数据给系统。实际就是在Nand Flash设备上面实现了XIP(execute In place)的功能。

XIPKERNEL文件至少要包括下面的模块:

Nk.exe;Kernel.dll;Coredll.dll;K.coredll.dll;Oalioctl.dll;
Filesys.dll;Fsdmgr.dll;Mspart.dll
Romfsd.dll;Binfs.dll;Default.fdf or boot.hv(here choose
boot.hv);Fpcrt.dll (ARM-only)
Ceddk.dll (if required by your flash driver);Smflash.dll
(your flash driver)

将上述模块添加进Config.bib中的Moudle段,加入方法如下:

MODULES
nk.exe        $(_FLATRELEASEDIR)\oal.exe
XIPKERNEL  SHZ
kernel.dll        $(_FLATRELEASEDIR)\kern.dll
XIPKERNEL  SHZ
……

4.2 修改Config.bib file的配置段部分

在Config.bib文件中的CONFIG下指定RAM_AUTOSIZE=OFF,ROM_AUTOSIZE=OFF,同时标识出CHAIN区域起始地址XIPSCHAIN的值。这个值要和MEMORY 段指定的值相匹配。

4.3 在注册表设置中添加相应的注册表键值

在本文中,XIP.bin映像文件被存放到Nand Flash存储设备上,为了让其支持BinFS文件系统,需要在注册表中的;HIVE BOOT SECTION和;END HIVE BOOT SECTION两条语句之间加入键值。

下面给出Nand Flash存储设备在注册表中的键值,其作用是将BinFS设定为默认的文件系统。

[HKEY_LOCAL_MACHINE\System\StorageManager\Profiles\
NANDFLASH]
"DefaultFileSystem"="BINFS"
"PartitionDriver"="mspart.dll"
"MountHidden"=dword:1
"MountAsROM"=dword:1
"Folder"="NandFlash"
"Name"= "FLASH Disk Block Device"
[HKEY_LOCAL_MACHINE\System\StorageManager\BinFS]
"FriendlyName"="BIN Filesystem"
"Dll"="binfs.dll"
"Paging"=dword:1

4.4 生成与调试

生成系统映像文件,如图4所示。


选择xip.bin文件并用EBOOT将其下载到硬件平台中,启动系统。经过测试,系统的启动时延缩短到8 s左右。打开“我的设备”,双击控制面板中的系统属性,可以看见系统的可用内存增大为61 020 KB。

本文提出一种普遍适用于Windows CE 6.0操作系统的Multi-bin技术。该技术的实现具有一定的通用性,不仅在Windows CE 6.0操作系统下实现了减少开机启动时延,而且节省了可观的内存空间,提高了用户质量体验(QoS)。基于本文提出的原理和方法对使用Windows CE操作系统的同类硬件平台(如ARM9、ARM11)的开发也具有一定的参考价值。




欢迎光临 DIY编程器网 (http://diybcq.com/) Powered by Discuz! X3.2