NK.bin与NK.nb0格式

转自: http://hi.baidu.com/luckdst/item/8b893ec69622a863f6c95d36

NK.bin与NK.nb0格式

       借用别人的解释:这里提到的bin是一种二进制镜像格式,以片断(section)为单位组织数据,每个片断都包括一个头,头里指定了起始地址,长度,校验值Platform Builder调用工具将WINCE内核所有文件以bin格式合并成一个文件,默认文件名为nk.bin。BootLoader又以同样的格式将nk.bin分解成多个文件放到RAM中。可以在命令行中键入“viewbin nk.bin”来查看bin文件中具体包括了哪些内容。键入Cvrtbin命令转换.bin格式文件为.sre格式或者.abx格式。http://www.cnblogs.com/wogoyixikexie/archive/2009/01/19/1378341.html
       nb0格式是原始的二进制镜像,它不包括头,一般情况下将内核下载到设备的RAM中运行都采用nb0格式。要生成nbx格式的文件,需要在相关.bib文件中确定如下值:ROMSTART、ROMWIDTH、ROMSIZE

       那么nk.bin是如何生成的?

      Romimage.exe is a locator application that creates Windows CE binary image (.bin) files, usually limited to a single file called Nk.bin. This means that Romimage

  • Reads Ce.bib to determine which %_FLATRELEASEDIR% binaries and files to include in the run-time image.
  • Assigns physical memory addresses to these binaries and files. (这部是如何实现的?)
  • Creates the run-time image Nk.bin.

For more information about Ce.bib, see Make Binary Image Tool.

      最近想搞multi bin后来发现我的bootloader是优龙的,不支持binfs分区格式化, 我想把eboot下的代码移植过来,应该可以的。

       但是我对则个binfs有点疑惑。按照道理说,binfs是针对nk.bin的,但是我们下载的时候却是nk.nb0,有些人下载nk.bin,但是下载完还是要解压成nk.nb0的。
我想问,binfs是怎么和nk.nb0联系起来的?
==============================来看看bin文件的格式=========================

      一个bin 文件在存储上是按下面的结构存储的

      组成:标记(7)+Image开始地址(1)+Image长度(1)
                 记录0地址+记录0长+记录0校验和+记录0内容(文件内容)
                记录1地址+记录1长+记录1校验和+记录1内容(文件内容)
                 ......
     最后一条记录是表示结束,Start = 0x00000000, Length = 0x8C072C3C是StartUp地址, Chksum = 0x00000000

      bin 文件的头部(不包括记录)可以用下面的结构表示
      struct BinFile{
                  BYTE signature[7]; // = { ''B'', ''0'', ''0'', ''0'', ''F'', ''F'', ''\a'' }
                  DWORD ImageStart
                  DWORD ImageLength
            };
        一般xipkernel.bin,nk.bin 都符合正常bin文件格式,包含记录开始0,1,2 记录为特殊记录,2做为cece的标记,其后4byte表示TOC地址(指向ROMHDR结构的数据),3记录开始都是文件记录,
———但是,我们实际用到却是nk.nb0文件,这个文件才是和文件系统帮顶起来的。我等下要找出他的格式来。先去吃午饭。

        首先,NK.BIN中的内容是被压缩过的,NK.NB0中的内容是没有压缩的。 两者大小的区别是因为在生成过程中BIN会将你设定的后面的NULL自动去掉,而NB0就不会。

         现在来用微软自带工具来看看这两个文件的格式到底有什么不同。

NK.bin与NK.nb0格式_第1张图片

       这幅图结合上面的解释可以知道,这个NK.bin文件的标志是BOOOFF,nk.nb0是没有这个标志的,要知道具体的信息,还是看MSDN好。

At the end of the boot loader development process described in the topic How to Develop a Boot Loader, you will have two different binary images for the boot loader: a .bin file and an .nb0 file. The Microsoft Windows® CE binary image data format (.bin) file is the most common format for Windows CE binary images. It is a binary file that consists of a number of individual records with associated per-record bookkeeping data. The format is convenient for minimizing the amount of data to be downloaded to the target device by removing the need to pad between records. For more information about the .bin file format, see Windows CE Binary Image Data Format (.bin).

The .nb0 file format is a raw binary image of the boot loader. The image is as it appears in the memory on the target device and does not contain the header information that the .bin file includes. The .nb0 file is typically larger than the .bin file. The .nb0 file is useful for placing the initial boot loader image on the target device. This is usually done with a built-in monitor program provided by the board manufacturer. You can also place the initial boot loader image on the target device through a JTAG connection using a JTAG probe. Once the .nb0 image is stored on the device, it should be able to download and update itself using the .bin file format from then on.

       我使用的是ADS开发的bootloader,这个bin文件不存在什么段的问题吧,应该和微软不一样的,全局变量的问题在哪里呢?但是现在造成偶尔不能启动是什么原因呢?最后发现又回到了原点。看来ADS下的bin文件格式也要搞清楚才行哦。

nk.bin文件格式

       开始7个字节为 42 30 30 30 46 46 0A 即“B000FF\x0A”,以次来判别文件类型。接下来4字节(DWORD)表示ImageStart, 4字节表示ImageLength如7字节后的8字节分别为:00 00 00 60 9C FA 33 01则表示ImageStart=0x60000000, ImageLength=0x0133FA9C接下来按Record格式:4字节start, 4 字节Length, 4字节CheckSum, Length字节的数据从Record[0]一直到Record[n].

最后一条Record的start+Length = ImageStart+ImageLength

÷÷NK.bin与NK.nb0的区别÷÷

在config.bib文件中,有如下三个设置:

ROMSTART=xxxx
ROMWIDTH=xxxx
ROMSIZE=xxxxxx
这3个变量必须被赋值.

nk.bin和nk.nb0都是CE的镜像。然而,我们在下载的过程中常常会遇到,有时候下载nk.bin,有时确是下载nk.nb0,这两者到底有什么区别呢?

首先,NK.BIN中的内容是被压缩过的,NK.NB0中的内容是没有压缩的。
两者大小的区别是因为在生成过程中BIN会将你设定的后面的NULL自动去掉,而NB0就不会。
NB0的大小就是第三个变量ROMSIZE所设置的大小。
由于nk.nb0是非压缩的数据,里面的数据就是NK展开以后在内存里面的数据。
而nk.bin是有压缩的数据,里面的数据是压缩以后类似于成块形的数据,被loader拷贝到内存以后没有区别。
由于bin文件需要解压,因而其下载方式也不一样,
通常,通过串口直接下载用nb0,pb下载用bin。
其次,nk.nb0是可以直接烧到FLASH/ROM中的,是代码镜像,可以直接跳转到其入口执行。
而nk.bin是Microsoft binary image格式的文件,必须按其格式定义解开到其指定的地址空间的位置才能执行。

///

       Viewbin是微软提供的一个命令行工具,在WinCE6.0中,可以在"\WINCE600\PUBLIC\COMMON\OAK\BIN \I386"找到他。Viewbin工具可以用来查看NK.bin文件。它可以从NK.bin中获得这个NK image的大小,运行的起始地址等。还能查看到里面所包含的模块,应用程序及相关的信息。

Viewbin的使用格式如下:
viewbin [parameter] [filename]

举几个例子吧:
1. viewbin -nk.bin

ViewBin... nk.bin
Image Start = 0xC02C0000, length = 0x00D5E380
Start address = 0xC02C1006
Checking record #126 for potential TOC (ROMOFFSET = 0x40000000)
Found pTOC = 0x8101c8d0
ROMOFFSET = 0x40000000
Done.
这条命令可以查看NK image的起始地址,长度等信息,这些信息应该和config.bib文件中定义的一致

2. viewbin -t nk.bin > output.txt
这条命令可以将NK image里面包含的模块及相关信息列成一个表并输出到output.txt里面,这样打开output.txt就可以看到里面包含了哪些模块,其中包括驱动,应用程序等。

3. viewbin -r nk.bin > output.txt
打印记录信息到output.txt中。



//如何导出NK.bin中的内容///

需要的工具:1.viewbin和cvrtbin:这两个是PB自带的工具,在\PUBLIC\COMMON\OAK\BIN\I386目录下.          

          2.dumprom:网上下载的.

第一步:用用viewbin程序打开NK.bin找出相关数据

我把工具和文件放在了同一文件夹里,即F:\wince

F:\wince>viewbin NK.bin
ViewBin... nk.bin

Image Start = 0x00220000, length = 0x01818324

                Start address = 0x00227378

Checking record #167 for potential TOC (ROMOFFSET = 0x80000000)

Found pTOC = 0x81a366a4

ROMOFFSET = 0x80000000

Done.
Done.

第二步:用cvrtbin程序生成后缀为nb0的文件

  把刚才找出起始地址及文件长度两组数据,分别对应填入下面命令中。

  即:cvrtbin.exe -r -a 0x00220000 -l 0x01818324 -w 32 nk.bin

  这样就生成nk.nb0文件

第三步:导出NK.nb0文件中的内容

  由NK.bin生成NK.nb0之后,在目录下再随便新建一个文件夹用来保存nk.nb0导出的文件,比如cefiles,然后运行:

    dumprom NK.nb0 -d cefiles

    这样,就在cefiles文件夹中生成了nk.bin中的各个文件。


深入理解.bin文件和.nb0文件

.bin文件是一个描述性质的映像文件,它由文件头(head)、镜像数据目的起始地址(ImageStart)、镜像数据长度(ImageLength)和多条相对独立的记录(record)构成。

  文件头(head)由7个字节组成,内容是:42 30 30 30 46 46 0A,即“B000FF/x0A”,这是判断镜像文件是.bin类型的依据。

  镜像数据目的起始地址(ImageStart)由4个字节组成,它定义了镜像文件解析后装载在内存中的起始地址。

  镜像数据长度(ImageLength)也由4个字节组成,它表示.bin镜像文件解析后在内存中占用的总的存储空间大小。

  每条记录(record)由4字节的起始存储地址(RecordStart)、4字节的数据长度(RecordLength)、4字节的校验码(RecordCheckSum)和RecordLength个字节的记录数据(RecordData)组成。

  由以上.bin的文件格式可知,.bin文件不是内存程序空间的一个简单的拷贝。所以它不能直接用串口烧写进内存或FLASH空间来直接运行,必须通过PB下载,通过EBOOT按照.bin文件的格式解析出来具体的内容并重新装载后才能运行。

  而.nb0文件就不一样,它是内存运行程序映像的一个硬拷贝,其数据内容和程序运行时在内存中的数据是一样的。鉴于此,.nb0可以通过串口下载到指定的位置直接运行。很明显,.nb0是一个不存在格式的映像文件。

  下面,我通过一个具体的.bin文件以及对应的nb0文件来帮助大家加深对以上概念的理解:

  用UltraEdit打开我们要分析的NK.bin文件和NK.nb0文件,为了方便分析,我分别截取了NK.bin和NK.nb0文件的一小部分:

           NK.bin文件的部分内容:

           00000000h: 42 30 30 30 46 46 0A 00 00 00 80 64 67 FA 00 00

           00000010h: 00 00 80 04 00 00 00 EB 01 00 00 FE 03 00 EA 40

           00000020h: 00 00 80 08 00 00 00 EE 02 00 00 45 43 45 43 1C

           00000030h: 48 FA 80 48 00 00 80 04 00 00 00 5E 01 00 00 1C

           00000040h: 48 FA 00 00 10 00 80 A0 3D 05 00 14 E3 F3 01 00

           00000050h: 00 0F E1 13 00 A0 E3 80 00 80 E3 40 00 80 E3 00

           ..................: ...  ...  ...  ...  ...  ...  ...  ...  ...  ...  ...  ...  ...  ...  ...  ...

           00053dd0h: F7 03 80 BC F7 03 80 A0 F7 03 80 01 00 00 00 84

           00053de0h: F2 04 80 A8 F2 04 80 EC F2 04 80 AC F2 04 80 A0

           ..................: ...  ...  ...  ...  ...  ...  ...  ...  ...  ...  ...  ...  ...  ...  ...  ...

           00f40960h: 12 00 00 00 12 00 00 64 AE 80 80 1C 36 FA 80 00

           00f40970h: 00 00 00 00 10 00 80 00 00 00 00

           对应的NK.nb0文件的部分内容:

           00000000h: FE 03 00 EA 00 00 00 00 00 00 00 00 00 00 00 00

           00000010h: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00

           00000020h: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00

           00000030h: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00

           00000040h: 45 43 45 43 1C 48 FA 80 1C 48 FA 00 00 00 00 00

           00000050h: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00

           ..................: ...  ...  ...  ...  ...  ...  ...  ...  ...  ...  ...  ...  ...  ...  ...  ...

           000000ff0h: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00

           00001000h: 00 00 0F E1 13 00 A0 E3 80 00 80 E3 40 00 80 E3

           00001010h: 00 F0 23 E1 10 0F 11 EE 01 0A C0 E3 04 00 C0 E3

           ..................: ...  ...  ...  ...  ...  ...  ...  ...  ...  ...  ...  ...  ...  ...  ...  ...

           00054D90h: 84 F2 04 80 A8 F2 04 80 EC F2 04 80 AC F2 04 80

           ..................: ...  ...  ...  ...  ...  ...  ...  ...  ...  ...  ...  ...  ...  ...  ...  ...

            00fa6760h: 1C 36 FA 80 00 00 00 00 00 00 00 00 00 00 00 00

            00fa6770h: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00

           ..................: ...  ...  ... 填充0一直到文件末尾...    ...  ...  ...  ...  ...  ...
           下面我们来分析上面的映像:
            首先看.bin映像:
            1.最开始是7字节的文件头42 30 30 30 46 46 0A;
            2.接下是4字节映像数据目的起始地址00 00 00 80,指出目的起始地址0x80000000;从而也告诉我们对应的.nb0文件运行时将装载到0x80000000去运行。
            3.接下来是4字节的映像数据长度64 67 FA 00,指出映像数据解析后所占的存储空间长度是0X00FA6764字节;我们再看.nb0文件地址0x00fa6760处的16字节的数据是1C 36 FA 80 00 00 00 00 00 00 00 00 00 00 00 00,而且从此以后的数据全部是00,由此可知0x00fa6764是最后的有效数据的地址。我想到这里朋友们已经知道.bin文件和.nb0文件之间的联系了。
            4.接下来4字节是第1条记录的起始地址00 00 00 80,指出第1条记录的起始地址是0x80000000;
            5.接下来4字节是第1条记录的长度 04 00 00 00,指出第1条记录的数据域长度是4个字节。
            6.接下来4字节是第1条记录的校验码EB 01 00 00;
            7.接下来4字节是第1条记录的数据内容FE 03 00 EA。到这里,我相信朋友们已经想起点什么。查看.nb0文件的起始4字节,正是我们刚才分析的第1条记录的数据内容。
            8.接下来4字节是第2条记录的起始地址40 00 00 80,指出第2条记录的起始地址是0x80000040;
            9.接下来4字节是第2条记录的长度 08 00 00 00,指出第2条记录的数据域长度是8个字节。
            10.接下来4字节是第2条记录的校验码EE 02 00 00;
            11.接下来8字节是第2条记录的数据内容45 43 45 43 1C 48 FA 80。再查看.nb0文件中0x00000040地址8字节内容:45 43 45 43 1C 48 FA 80,正是.bin文件中第2条记录的数据域内容。
            如此类推,我们采用同样的方法可以解析出.bin文件中的所有记录项。并能根据.bin的记录构造出对应的.nb0文件。
            到此,我相信朋友们已经很深入的了解了.bin文件的格式,并清楚了.bin文件和.nb0文件的区别和联系了。


本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/zengdebiao/archive/2009/04/06/4052487.aspx


你可能感兴趣的:(WinCE,WinCE,debug)