BIN与NB0镜像文件格式
??
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); } } (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |