Image格式之NB0

转载 2010年05月31日 16:11:00

Nb0格式并不是每个人都能看到的,很多时候玩wince 的人往往只知道把bin档下载 到device就可以执行了,其实真正在内存 中跑的,是XIP的nb0格式。
所幸我们的做法是先在PC上,就把PB编译 好的BIN 档转换为nb0,然后再用升级工具 下载到device的NAND中。今天我们来探讨 nb0,也即wince在内存中的真实写照!
下图是根据我们自己的一个nb0的image画的一张layout图,让我们来看看nb0里面到底是什么样的一种结构,图中假设bib设置的 RAMIMAGE的起始地址 是0x8C000000,大小为0xF00000。如果你的image支持multi-bin,那么在这里我们假设这是第一个支持XIP的region。
 
1.跳转指令:一般从最开始的位置,这里也就是0x8c000000会有一个跳转指令,可能是方便bootloader 在不知道入口地址的情况下,直接跳到nb0的头,执行这句代码 就跳转到了nk.exe的入口地址,开始 kernel的引导。细心的同学可能会发现,nk.exe的source文件 和其他的exe默认入口是Winmain不同,它有一个special的入口地址在此指定,类似的“EXEENTRY=StartUp”,那么这个跳转指令就是指向了StartUp函数 了。
2.ECEC标识: 在从开始位置编译0x40左右的位置,会有一个string='ECEC',寻找这个字符串后,接下来的DWORD值就是ROMHDR结构体的地址。
3.ROMHDR:这个结构体基本上描述了wince下面内存的大体布局,图中,ROMHDR位于0x8c0d9840的地址。
结构体的定义如下:
typedef struct ROMHDR {
  ULONG dllfirst;  //表示的是slot1中的虚拟内存的最低点,也就是说如果还有其他的XIP的image要并进来,它的dll要从这里开始编址。这里是0x01F501FF,DLL的地址是从上向下张的。
  ULONG dlllast; //这个是slot1的头顶,这里是0x02000000
  ULONG physfirst; //这就是这个XIP region的开始点,对应的是虚拟内存,可以在ce下直接访问 ,这里是0x8c000000。
  ULONG physlast; //这是这个XIP region的结束点,即最后一行有用的数据 的虚拟地址。
  ULONG nummods;
  ULONG ulRAMStart;   //这个是说program ram从哪里开始。
  ULONG ulRAMFree;
  ULONG ulRAMEnd;
  ULONG ulCopyEntries;
  ULONG ulCopyOffset;
  ULONG ulProfileLen;
  ULONG ulProfileOffset;
  ULONG numfiles;
  ULONG ulKernelFlags;
  ULONG ulFSRamPercent;
  ULONG ulDrivglobStart;
  ULONG ulDrivglobLen;
  USHORT usCPUType;
  USHORT usMiscFlags;
  PVOID pExtensions;  //这个就是说,当有Multibin在后面的时候,指向一个扩展表来描述后面的的region,下面会描述。图中这张表的地址在0x8c002210.
  ULONG ulTrackingStart;
  ULONG ulTrackingLen;
} ROMHDR;

详细的每个成员什么作用可以参考下面的URL:http://msdn.microsoft.com/en-us/library/aa908726.aspx
4.ROMHDR Extensions:就是3的扩展表,也是个结构体,如果不是multibin或者当前的nb0文件不是第一个RAMIMAGE,都不会有此表。
该表有一个NEXT指针,指向了0x8c07d550,这个地址保存的是chain的信息表。
5.Chain information: 这个东西可以让系统 知道有几个Multibin,大家看图就知道了。
6.FIles and modules index data: 这部分数据往往是在nb0的最末尾,它提供了nb0文件内部的文件信息,就是借助它,你才有可能在CE的windows目录看到我们编译之前的文件。 BINFS文件系统也是借助于这些数据给用户提供文件索引的。
7.data:这就是最基本的数据了,romimage把module部分的dll和exe按照PE分析好,事先安排好内存的 layout(prefix),放在nb0文件的相应位置,nb0文件和内存是按照字节一一线性对齐的,打个比方来说,在我们的例子里面,文件的0偏移位置就是内存的0x8c000000,那么nb0文件偏移0x40的位置的地址就是内存0x8c000040了,就这么简单。
现在有个问题:nb0里面可以放FILES类型的DLL/EXE或者其他文件?这些应该是不会不实现处理的,放进来会有问题么?我们回去试试看吧,呵呵。

bin、nb0的区别

1. BIN:Microsoft Windows CE binary image data format(.bin)文件格式中包含若干个独立的纪录(section),需要分别加载到ram中执行。.bi...
  • formerman
  • formerman
  • 2009-07-15 14:59:00
  • 2735

Dumprom,提取nb0格式ROM文件的超级利器

  • 2012年02月16日 00:45
  • 128KB
  • 下载

Image格式之NB0(By Walle@ARMCE)

 Image格式之NB0(By Walle@ARMCE)http://www.armce.com/bbs/thread-26-1-6.html
  • armce
  • armce
  • 2009-11-17 14:40:00
  • 256

BIN与NB0镜像文件格式

1 简介 BIN文件是一种二进制ROM映像文件格式,同NB0文件相比,它压缩了无效的数据。BIN文件中包含了文件头和许多的记录,每个记录都给出了在实际映像中的首地址、长度、校验码和数据。 NB0文...
  • xuleizhichen
  • xuleizhichen
  • 2011-08-04 08:34:12
  • 779

提取nk.nb0中的文件

http://www.nah6.com/~itsme/cvs-xdadevtools/dumprom/这是国外某高人写的提取wince镜像文件的源代码,下载下来后编译可以生成最后的dumprom.ex...
  • saintony
  • saintony
  • 2007-01-15 14:44:00
  • 4925

WINCE镜像文件XIP.NB0

  • 2011年11月01日 19:57
  • 38.12MB
  • 下载

转载—— WinCE5.0 BSP BOOTLOADER开发详解-生成bin和nb0

一,生成EBOOT.exe 1,在D:/WINCE500/PLATFORM/Sun2410/SRC/BOOTLOADER/EBOOT目录下,建立名为Startup.s的汇编文件。 源代码如下: OPT...
  • gooogleman
  • gooogleman
  • 2008-10-27 17:02:00
  • 2873

VS2005控制台程序修改nb0文件

VS2005控制台程序修改nb0文件   我们要实现的功能就是通过CMD传递进来的值来在nb0文件末尾增加版本信息,新建控制台程序,自动生成的main函数如下,默认的代码非常简单: int _t...
  • LoongEmbedded
  • LoongEmbedded
  • 2014-06-10 08:56:32
  • 1237

dumpromy解包NB0文件

  • 2012年09月27日 14:04
  • 83KB
  • 下载

BIN文件转NB0文件(支持WINCE与WM)

  • 2009年07月14日 10:38
  • 9KB
  • 下载
收藏助手
不良信息举报
您举报文章:Image格式之NB0
举报原因:
原因补充:

(最多只允许输入30个字)