当载xip.bin,nk.bin,eboot.bin时在这里执行
if (!memcmp (hdr, "B000FF\x0A", BL_HDRSIG_SIZE))
{
g_bBINDownload = TRUE;
//2012.2.2 YANGQI
EdbgOutputDebugString ("B000FF\x0A OK \r\n");
if (!OEMReadData (sizeof (DWORD), (LPBYTE) &dwImageStart)//
|| !OEMReadData (sizeof (DWORD), (LPBYTE) &dwImageLength))
{
EdbgOutputDebugString ("Unable to read image start/length\r\n");
HALT (BLERR_MAGIC);
return (FALSE);
}
具体分析一下:
memcmp (hdr, "B000FF\x0A", BL_HDRSIG_SIZE)
内存比较函数,就不多说了,功能,比较hdr和B000FF\x0A在内存区域中的前BL_HDRSIG_SIZE = 7个字节是否相同。
当str1<str12时,返回值<0;当str11=str12时,返回值=0;当str11>str12时,返回值>0。
所以这里if (!memcmp (hdr, "B000FF\x0A", BL_HDRSIG_SIZE)) 表示当相等时的结果。
if (!OEMReadData (sizeof (DWORD), (LPBYTE) &dwImageStart) //yangqi 读取*BIN前7个头字节后的第一个DWORD到dwImageStart。 *bin记录了其映像起始地址
|| !OEMReadData (sizeof (DWORD), (LPBYTE) &dwImageLength))//读取上面接着的一个DWORD到dwImageLength。*bin记录了其映像长度
{
EdbgOutputDebugString ("Unable to read image start/length\r\n");
HALT (BLERR_MAGIC);
return (FALSE);
}
既然这样,我们用WinHex来看看BIN文件的开始位置处都有什么信息··
来分析一下:
PB编译的镜像文件,一般都会同时以BIN文件和BN0两种形式给出。NB0文件是地址空间的一个完整的镜像文件,而BIN文件是一种二进制ROM映像文件格式,它压缩了无效的数据。BIN映像文件中包含了头文件和许多的段,每个段都给出了在实际用映像的首地址、长度、校验码和数据。
如以上数据:
Offset 0 1 2 3 4 5 6 7 8 9 A B C D E F
00000000 42 30 30 30 46 46 0A 00 80 03 80 E0 75 06 00 00 B000FF..€.€鄒...
00000010 80 03 80 04 00 00 00 96 01 00 00 5A 51 01 EA 40 €.€....?..ZQ.闌
00000020 80 03 80 08 00 00 00 4B 03 00 00 45 43 45 43 C8 €.€....K...ECEC?
00000030 EA 09 80 48 80 03 80 04 00 00 00 38 01 00 00 C8 ?€H€.€....8...?
00000040 6A 06 00 00 90 03 80 2C 58 06 00 C6 00 F4 02 00 j...?€,X..??.
00000050 00 00 00 8A D8 7D 4D 00 00 00 00 02 00 00 00 55 ...娯}M........U
00000060 00 00 00 44 43 05 00 44 37 05 00 00 00 00 00 40 ...DC..D7......@
00000070 82 0D 80 00 00 00 00 00 00 00 00 33 40 00 00 01 ?€........3@...
42 30 30 46 46 0A :BIN 的前7个字节 BOOOFF/0X0A
一个DWDRD
DWORD | 32-bit unsigned integer. |
00 80 03 80 :四个字节映像起始地址dwImageStart。指出地址为0x80038000,也就是说.bin文件运行时将装载到0x80038000去运行。
E0 75 06 00 :四个字节单位镜像长度ImageLength。 长度地址为0x000675E0,
再往下就是逐条记录。也就是正文了··每一条记录(Record)由四个字节的存储地址(RecordStart)、四个字节的数据长度(RecordLength),四个字节的校验码(RecordCheckSum)和RecordLength个字节的记录数据(RecordData)组成。
由以上数据我们知道,第一条记录起始地址:
00 80 03 80 :四个字节记录的起始地址。即为0x 80038000
存放长度为:
04 00 00 00 :四个字节长度即为:0x00000004,
校验码为:
96 01 00 00 :四个字节长度即为0x00000196
四个字节数据为:
5A 51 01 EA :四个字节即为0xEA01515A
接下来再就BIB文件进一步分析,以及校验是如何校验的····
转载请注明出处。作者:四极管。广西师范大学 电子工程学院大学生科技创新基地 邮箱: [email protected]。