3.11.1. AIC 启动镜像格式
ZX BROM 所使用的启动镜像格式。
数据区域 |
数据分块 |
字段 |
字节 |
描述 |
---|---|---|---|---|
Signed Area |
Block1 (256B) |
Magic |
4 |
特征字符串,固定为 ”AIC ” |
Checksum |
4 |
32 bit 累加和校验的校验值。安全启动方案设为0. |
||
Header version |
4 |
本文件头结构的版本号,当前版本为v1.0: 0x00010001 |
||
Image length |
4 |
从文件开头到结束的总数据长度 |
||
Firmware version |
4 |
固件版本号,不同版本之间应单调递增 |
||
Loader length |
4 |
第一级引导程序的有效数据的长度,不包括填充数据 |
||
Load address |
4 |
镜像数据加载到内存的目标地址 |
||
Entry point |
4 |
第一级引导程序的可执行代码入口地址 |
||
Signature algorithm |
4 |
0:没有签名,仅计算Checksum;1:RSA-2048; |
||
Encryption algorithm |
4 |
0:固件不加密;1:AES-128-CBC 加密 |
||
Signature result offset |
4 |
数字签名数据区域的偏移,从文件头开始计算 |
||
Signature result length |
4 |
数字签名的长度 |
||
Signature key offset |
4 |
RSA 公钥数据区域的偏移 |
||
Signature key length |
4 |
RSA 公钥数据的长度 |
||
IV data offset |
4 |
AES-CBC IV数据区域的偏移 |
||
IV data length |
4 |
IV 的长度 |
||
Private data offset |
4 |
第一级引导程序私有数据区域的偏移 |
||
Private data length |
4 |
第一级引导程序私有数据区域的长度 |
||
PBP offset |
4 |
PBP 数据区域的偏移 |
||
PBP length |
4 |
PBP 数据的长度 |
||
Padding |
176 |
填充,使得头部刚好 256 字节 |
||
Block2 |
Loader binary data |
X |
第一级引导程序的保存区域 |
|
Padding |
X |
增加填充,使得 256 字节对齐 |
||
Block3 |
Private data area |
X |
存放镜像代码中可能使用的私有数据。 |
|
Signature key area |
X |
存放 RSA 公钥,DER 格式的密钥文件。应4字节对齐。 |
||
IV data area |
16 |
存放 AES IV 数据,16字节。应4字节对齐。 |
||
PBP area |
X |
存放 PBP 程序。应16字节对齐。 |
||
Padding |
X |
填充,使得 256 byte 对齐,方便计算数字签名 |
||
Block4 |
Signature result area |
256 |
前面所有内容的数字签名 |
对于 NAND,在保存第一级引导程序的时候,还会在每个 NAND Block 的第一个 Page 生成 Page Table。Page Table 的作用是用于快速索引镜像数据所在的不同备份 Page 地址。
Index |
Content (20 Bytes) |
||||
---|---|---|---|---|---|
0 |
Magic(4 Bytes) |
Count(4 Bytes) |
Padding (12 Bytes) |
||
1 |
PA(4 Bytes) (Backup 0) |
PA(4 Bytes) (Backup 1) |
PA(4 Bytes) (Backup 2) |
PA(4 Bytes) (Backup 3) |
Checksum (4 Bytes) |
2 |
PA(4 Bytes) (Backup 0) |
PA(4 Bytes) (Backup 1) |
PA(4 Bytes) (Backup 2) |
PA(4 Bytes) (Backup 3) |
Checksum (4 Bytes) |
… |
… |
… |
… |
… |
… |
Magic 开头的 20 字节,是 Page Table 的头信息,其中 Magic 的值固定为 “AICP”, Count 表示 BootLoader 的数据被分为几个 Page 进行保存。
从 Index 1 表示 BootLoader 的第一个 Page 数据有4个备份,被分别存放在对应 PA(Page address) 所指的 NAND Page 中,Checksum 值是该 Page 数据的校验值。
3.11.2. 烧录镜像格式
ZX 的烧录镜像文件由组件(FirmWare Component) 以及对应的组件元信息组成。 数据分布如下图所示。
其中一些需要打包的数据文件,都被当做组件(FWC)进行处理,包括 SPL,U-Boot,Kernel,DTB 等数据。
Image Header 的具体格式如下:
struct zx_fw_hdr{
char magic[8]; // 固定为 "AIC.FW"
char platform[64]; // 该镜像文件适用的芯片平台
char product[64]; // 该镜像文件适用的产品型号
char version[64]; // 该镜像的版本
char media_type[64];// 该镜像文件可烧录的存储介质
u32 media_dev_id; // 该镜像文件可烧录的存储介质 ID
u8 nand_id[64]; // 当存储介质为 NAND 时,适用的 NAND ID
u32 meta_offset; // FWC Meta Area start offset
u32 meta_size; // FWC Meta Area size
u32 file_offset; // FWC File data Area start offset
u32 file_size; // FWC File data Area size
u8 padding[]; // Pad to 2048
};
FWC Meta 的格式如下:
struct zx_fwc_meta {
char magic[8]; // 固定为 "META"
char name[64]; // 对应组件的名字
char partition[64]; // 该组件要烧录的分区名字
u32 offset; // 该组件数据在镜像文件中的偏移
u32 size; // 该组件数据的大小
u32 crc32; // 该组件数据的CRC32校验值
u32 ram; // 当组件要下载到平台 RAM 时,要下载的地址
char attr[64] // 该组件的属性,字符串表示
u8 padding[296]; // Pad to 512
};