转自:http://www.armce.cn/bbs/thread-21-1-2.html
引用需注明来源http://www.armce.cn
今天探讨我们玩Wince的人一定见过的BIN文件,只要你在config.bib 里面设置了RAMIMAGE或是NANDIMAGE,你将会在romimage后得到对应名字的.bin文件。
比如下面这段:
NK1 82500000 01E00000 RAMIMAGE
NK2 82500000 01E00000 NANDIMAGE
会生成NK1.bin 和 NK2.bin。
那么这个bin到底是一种什么格式,可不可以直接烧入到NAND或者直接download到内存中去运行呢? 从表面上看,我们很多时候通过eboot等bootloader是可以实现直接下载BIN档到内存跑的,但是里面是需要先做一些处理步骤的,理论上说直接能在内存里面跑的格式是rawdata格式即NB0,关于NB0我们会在后续帖子里面给大家讲述,今天只谈BIN档。
romimage的直接产物就是bin格式,先来看张图,用微软提供的viewbin工具看看能看到什么。
从图中看到的是,这个例子的BIN档里面一共有19个records,每个记录都有起始地址和长度和checksum。bin格式就是由这些记录构成的简单格式,下面是它结构体描述:
struct BinFile{
BYTE signature[7]; // = { ''B'', ''0'', ''0'', ''0'', ''F'', ''F'', ''/a'' }
DWORD ImageStart
DWORD ImageLength
Record ImageRecords[RecordNum] };
每个记录包含了记录的信息和数据段。每个记录并不是和image里面的文件一一对应的,是微软把所有的文件编译好的原始数据分类包装了一下,具体如何分类在此还需要高手加以补充说明,romimage的源码我还是看不太明白,呵呵。
每个record是用下面的结构体来存储的:
struct Record{
DWORD address;
DWORD length;
DWORD chksum;
};
BYTE[length]; 每个record后就尾随长度为length的数据段。
看完上面两个结构体大家会感觉原来bin真的很简单哦,但是也基本上没有什么资料来介绍它,我们再来看一个用ultraedit直接打开bin文件,来个正面接触:
用这张图参考前面的两个结构体,大家就可以明明白白清清楚楚了解bin的内脏了。知己知彼百战不殆,所以你也已经知道了,BIN只是一种封装image的手段,里面的数据虽然被切分为records,但是是比较完整的,以moudle形式编译的exe/dll也不会丢失PE头信息,PE头是很重要的,里面包含执行档的编译时间等额外非执行必须的信息。如果你愿意,你完全可以拿到bin档,然后反解出里面包的原始的dll和exe文件的。这个优点是相对于另一种image格式即nb0而言的,在bib文件中,放置在moudle区域的dll或exe在nb0里面都是去掉PE头的,nb0文件里面放置只是romiange解析好PE头后分配了虚拟内存地址的code段,data段;bin格式也不会因为有预留内存空间而增大BIN文件的大小,这个优点也是相对于nb0格式的,因为nb0格式是支持XIP的,里面的结构等于SDRAM的映射,所以如果SDRAM内部有reserve一段很大的内存,对应的nb0文件也会增大很多,而bin的内容只有和里面包的exe/dll/file有关的数据。
除了包了exe/dll/resource之类的文件外,bin档里面可能还有一些romimage生成的特殊记录,比如上图最后的一个记录,address和chksum都为0的那条,在launchaddress的位置就放置了NK.exe也就是我们的kernel的入口地址,方便bootloader找到CE的入口地址并且跳转进入CE执行。还有第一张图中的高亮的record9,这个就是ROMHDR了,这个头很重要,后续我会介绍的。
bin格式往往不会直接写到nand上面,需要下面的步骤转换成为nb0格式,再烧入,否则就需要每次启动的时候做这个动作,如果你觉得比较合理,可以不要参考下图。
哈哈,下个章节继续讲另外一个格式,就是nb0啦,这个比较有用,因为可以帮助我们破解CE哦!!!