admin管理员组

文章数量:1531532

2024年7月20日发(作者:)

认识Windows CE操作系统

镜像文件的格式

被BootloaderMain调用的DownloadImage函数负责从开发计算机处下载操作系统

镜像到嵌入式目标设备,它是一个BLCOMMON库函数,不是OEM函数,其实现源代

码在%_WINCEROOT%PLATFORMCOMMONSRCCOMMON BOOTBLCOMMONblcommon.c源

文件中。尽管这个函数的源代码由微软提供,但是用户需要实现几个OEM函数供它

调用,以从以太网端口(或者其他外设端口)读取操作系统镜像数据。下面介绍一

下这个不需OEM用户开发实现的DownloadImage函数的源代码,目的是从中获取

Windows CE操作系统,也包括BootLoader自身所使用的镜像文件的格式信息,这

些信息对于用户的开发和调试工作会有所帮助。

由Windows CE的开发工具Platform Builder编译生成的Windows CE操作系

统及BootLoader的镜像文件主要有两种格式类型——以.bin为文件名后缀的记录

型镜像文件和以.nb0为后缀的原始型(raw)镜像文件,前者以记录(Record)为

单位组织镜像的数据,后者则是镜像在嵌入式系统中运行时的二进制数据的快照。

DownloadImage函数执行的第一步是调用GetImageType函数获知镜像文件的

格式类型。GetImageType也是BLCOMMON库函数,与DownloadImage函数在同一源

文件中实现。GetImageType函数查询镜像文件格式类型的原理十分简单:每一个

Windows CE镜像文件在文件数据的起始位置都有一个7字节的特征码(magic

number),它与镜像文件的格式一一对应如下:

"N000FFx0A"——BL_IMAGE_TYPE_MANIFEST

"X000FFx0A"——BL_IMAGE_TYPE_MULTIXIP

"B000FFx0A"——BL_IMAGE_TYPE_BIN

"S000FFx0A"——BL_IMAGE_TYPE_SIGNED_BIN

"R000FFx0A"——BL_IMAGE_TYPE_SIGNED_NB0

无特征码——BL_IMAGE_TYPE_UNKNOWN

以上的前4种类型都是记录型镜像格式,只有BL_IMAGE_TYPE_SIGNED_NB0代

表原始型镜像文件格式,此外DownloadImage函数把无特征码的

BL_IMAGE_TYPE_UNKNOWN类型也当作原始型镜像来处理。BL_IMAGE_TYPE_MULTIXIP

类型在Windows CE 5.0和5.0以前的版本中用于表示多区段的镜像文件,在

Windows CE 6.0版本中使用BL_IMAGE_ TYPE_MANIFEST类型处理多区段的操作系

统镜像,不再支持BL_IMAGE_TYPE_MULTIXIP类型,仅为了在源代码中保持向下兼

容而保留该类型的定义。

BL_IMAGE_TYPE_MANIFEST类型的镜像文件的数据是多区段的记录型镜像文件

的区段(Region)信息。多区段的镜像,简单地说,就是操作系统或者

BootLoader的运行时二进制数据分散在不连续的物理存储区间。Manifest的字面

含义是“载货单”,该类型的镜像文件并不是真正的Windows CE操作系统的或者

BootLoader的二进制运行时数据,只是供下载多区段型镜像所使用的头信息。由

于镜像数据的性质特殊,BL_IMAGE_ TYPE_MANIFEST类型的镜像文件——也称作

Manifest数据——与一般的镜像文件数据的存放位置不同,它使用专门的

DownloadManifest型全局变量g_DownloadManifest来存放。DownloadManifest结

构体类型在头文件%_WINCEROOT%PUBLICCOMMONOAKINC blcommon.h中定义如

下:

typedef struct _MultiBINInfo_

{

DWORD dwNumRegions; // Number of files to be

downloaded.

RegionInfo Region[BL_MAX_BIN_REGIONS];

} MultiBINInfo, *PMultiBINInfo;

typedef MultiBINInfo DownloadManifest;

多区段意味着多文件,即一个操作系统或者BootLoader的二进制运行时数据

存放在多个镜像文件中,这多个镜像文件的数据对应于可以连续也可以不连续的多

个物理存储区域。DownloadManifest结构体的成员dwNumRegions就是多区段镜像

的区段个数,也即是后续多个镜像文件的文件个数。Region数组成员负责具体存

放各区段的信息,BL_MAX_BIN_ REGIONS在头文件

%_WINCEROOT%PUBLICCOMMONOAKINC blcommon.h中定义为25,意味着多区段

的镜像区段数最大不得超过25。Region数组成员的元素类型RegionInfo又是一个

在头文件blcommon.h中定义的结构体:

typedef struct _RegionInfo_

{

DWORD dwRegionStart;

DWORD dwRegionLength;

CHAR szFileName[MAX_PATH];

} RegionInfo, *PRegionInfo;

RegionInfo结构体的3个成员dwRegionStart、dwRegionLength、

szFileName含义分别是一个镜像区段在物理存储中的起始地址、以字节为单位的

区段长度和与镜像区段相对应的镜像文件的文件名。

对于BL_IMAGE_TYPE_MANIFEST类型的镜像文件,文件数据中紧随7字节的格

式类型特征码之后从下载端口读出的是4字节的校验数据,继之是4字节的区段个

数。区段个数数据理所当然存放在g_DownloadManifest全局变量的dwNumRegions

成员中,随后依次读出的是镜像的g_egions个区段的属

性数据——起始地址、区段长度、区段数据的镜像文件名,按顺序存放在

g_数组的各个元素中。DownloadImage函数调用

CheckImageManifest函数读取4字节校验数据和随后的全部Manifest数据,然后

CheckImageManifest函数调用VerifyChecksum函数对Manifest数据执行校验,

不过校验范围仅限于存放在g_数组中的区段头信息的数

据,不包括4字节的g_egions的数据。

BL_IMAGE_TYPE_MANIFEST类型在所有的镜像文件格式类型中比较另类,它只

是供下载其他类型的镜像文件而使用的前导信息,本身并不包含有效的Windows

CE操作系统或者BootLoader的二进制运行时数据。如果操作系统的镜像只有一个

区段,或者是使用自身包含有存储位置等头信息的记录型镜像文件格式,也可以不

使用Manifest前导数据。BL_IMAGE_TYPE_MANIFEST类型的镜像文件下载完成以

后,DownloadImage函数并不立即返回,还要依据全局变量g_DownloadManifest

中的Manifest数据所提供的信息继续下载装载有真实的操作系统二进制数据的镜

像文件。

BL_IMAGE_TYPE_BIN类型是最普通最常用的记录型镜像文件格式,该类型的

镜像文件均以.bin为文件名后缀,DownloadImage函数调用DownloadBin函数处理

这种类型的镜像文件,DownloadImage也是一个BLCOMMON库函数。在

BL_IMAGE_TYPE_BIN类型的镜像文件中,紧随着最初的7字节特征码之后是该镜像

文件在嵌入式系统中的目的地的物理存储起始地址和以字节为单位的长度,各占4

字节,这两个数据的含义分别对应于RegionInfo结构体的dwRegionStart、

dwRegionLength两成员。接下来的便是具体存放操作系统二进制数据的拥有相同

结构的多条记录(Record),每条记录由4字节的内存起始地址dwRecAddr、4字

节的记录长度dwRecLen、4字节的校验码dwRecChk和dwRecLen个字节的记录数据

组成。DownloadImage函数依次从下载端口读出各条记录并且对它们执行校验,校

验也是以记录为单位,待校验无误以后将去除头信息的记录数据存放到dwRecAddr

指定地址的物理存储位置。如果记录的目的存储位置是Flash存储设备,则通常要

先缓存在RAM内存中,待整个镜像文件全部下载完再一起写入Flash。

与BL_IMAGE_TYPE_BIN类型相似的最普通常用的原始型(Raw)镜像文件

以.nb0为文件名后缀,它们使用DownloadNB0函数进行处理。由于原始型镜像文

件的数据只是物理存储中的Windows CE操作系统或者BootLoader的二进制运行时

数据的一个最直接的快照,所以它是完全无格式的,甚至都没有7字节的特征码,

在GetImageType函数中将这种镜像文件格式类型定义为

BL_IMAGE_TYPE_UNKNOWN。通常情况下,DownloadImage函数将无特征码的

BL_IMAGE_TYPE_UNKNOWN类型都当作原始型镜像文件处理,但是在安全性要求较高

的情况下(定义了宏SECURE_BOOTLOADER)无特征码的镜像文件是不应该被

BootLoader接受的。原始型镜像文件的处理方法是最简单的,BootLoader只需从

下载端口中读出全部的镜像数据并且存放到相应的存储位置,而且无需处理校验。

原始型镜像文件的数据在物理存储中的起始地址和长度都取决于Manifest数据,

因而.nb0型的镜像文件不能单独下载,BootLoader必须先下载作为它的前导属性

信息的BL_IMAGE_TYPE_MANIFEST类型的镜像文件。

BL_IMAGE_TYPE_SIGNED_BIN和BL_IMAGE_TYPE_SIGNED_NB0是两个带有数字

签名的Windows CE镜像文件格式类型,用在对BootLoader的安全性要求比较高的

场合。DownloadImage函数分别调用函数DownloadSignedBin和

DownloadSignedNB0对它们进行处理,被调用的这两个函数也都是BLCOMMON库函

数。

BL_IMAGE_TYPE_SIGNED_BIN类型的镜像文件是基于BL_IMAGE_TYPE_BIN类型

的,在它的7字节的校验码“S000FFx0A”之后是4字节的物理存储起始地址和4

字节的镜像长度,这与BL_IMAGE_TYPE_BIN类型是完全相同的。

BL_IMAGE_TYPE_SIGNED_BIN类型也使用记录来组织镜像的数据,与

BL_IMAGE_TYPE_BIN类型不同的是,在它的记录之上还有一级在源代码中称为包

(PACKET)的数据封装,包是在头文件%_WINCEROOT%

PUBLICCOMMONOAKINCsbl.h中定义的一个结构体:

本文标签: 镜像文件数据函数类型镜像