四极管 BIN文件下载数据结构分析(一)

 当载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文件的开始位置处都有什么信息··

 

四极管 BIN文件下载数据结构分析(一)_第1张图片

来分析一下:

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]

 

你可能感兴趣的:(数据结构,c,image,存储)