加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

BIN与NB0镜像文件格式

发布时间:2020-12-15 06:55:07 所属栏目:百科 来源:网络整理
导读:?? 1?简介 BIN文件是一种二进制ROM映像文件格式,同NB0文件相比,它压缩了无效的数据。BIN文件中包含了文件头和许多的记录,每个记录都给出了在实际映像中的首地址、长度、校验码和数据。 NB0文件是地址空间的一个完整的映像文件,相当于地址空间的硬拷贝。N
??

1?简介

BIN文件是一种二进制ROM映像文件格式,同NB0文件相比,它压缩了无效的数据。BIN文件中包含了文件头和许多的记录,每个记录都给出了在实际映像中的首地址、长度、校验码和数据。

NB0文件是地址空间的一个完整的映像文件,相当于地址空间的硬拷贝。Nb0是一个不存在格式的印象文件。

编译器编译出来的镜像文件格式有bin和nb0两种,这里的nb0文件和烧写到flash中的nb0文件是不一样的,这里的nb0大小是由bib文件中的ROMSIZE字段设置的,如编译器编译出来的eboot.nb0大小是512k,但烧写到flash中的eboot.nb0约为396k(eboot.bin大小391k左右)。

2?BIN文件格式

?首先是一个文件头(15byte),具体结构如下:

IMAGE?HEADER?15?Bytes:

7?byte?---?bin文件标志,固定为4230303046460A,即?B000FF加一个回车符

4?byte?---?starting?physical?address?of?image

4?byte?---?physical?length?of?image(这个就是解压后的nb0文件大小了)

然后就是一个一个的记录数据了,每个记录前面有个记录头,具体结构如下:

IMAGE?RECORD?HEADER?12?Bytes:

4?byte?---?physical?address?of?record

4?byte?---?length?of?record

4?byte?---?checksum?of?record?(检验信息)

跟在记录头后面的该记录的数据,长度由记录头的长度字段指明

3?解压过程

简而言之,bin格式到nb0格式的转换过程如下:

第一步,读取bin文件的文件头信息,根据其起始地址和长度,把对应的内存清空

第二部,循环读取bin文件记录头信息,并且相应记录数据写入到记录头标明的地址处

为什么nb0格式文件要比bin文件大呢?

vs2005中打开Build->Open?Release?Directory?in?Build?Window,输入viewbin?-r?eboot.bin,可以看到:

看前面两个记录信息:

Record?[??0]?:?Start?=?0x80030000,?Length?=?0x00000004,?Chksum?=?0x000001FC

Record?[??1]?:?Start?=?0x80030040,?Length?=?0x00000008,?Chksum?=?0x00000358

可以知道两个start?address之间差0x40(64?byte),但是第一个记录只有4?byte的数据。这就是为什么bin文件比nb0文件小的原因了。剩下的60?byte填充了0,?这就是解压过程的第一步做的,把这段内存清空为0

4?相应代码流程

转换过程的代码在***BLCOMMONblcommon.c中的DownloadBin函数中,大致流程如下:

static?BOOL?DownloadBin?(LPDWORD?pdwImageStart,?LPDWORD?pdwImageLength,?LPDWORD?pdwLaunchAddr)

{

//?对应解压过程的第一步,读取bin文件的文件头信息,根据其起始地址和长度,把对 / //?应的内存清空

memset(?(LPVOID)?OEMMapMemAddr(pCurDownloadFile->dwRegionStart,? pCurDownloadFile->dwRegionStart),?pCurDownloadFile->dwRegionLength?);

//?对应解压过程的第二步,?循环读取bin文件记录头信息,并且相应记录数据写入到记?? //?录头标明的地址处

????while?(?OEMReadData?(sizeof?(DWORD),?(LPBYTE)?&dwRecAddr)??&&

????????????OEMReadData?(sizeof?(DWORD),?(LPBYTE)?&dwRecLen)???&&

????????????OEMReadData?(sizeof?(DWORD),?(LPBYTE)?&dwRecChk)?)

????{

lpDest?=?OEMMapMemAddr?(pCurDownloadFile->dwRegionStart,?dwRecAddr);

OEMReadData?(dwRecLen,?lpDest);

}

}

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读