Nboot与Eboot

nboot和Eboot的说明和调用方式

nboot是从NAND   flash读image到内存并执行,eboot是从以太网(用tftp)下载image到内存并执行。将nboot.nb0烧到第0块,将eboot.nb0烧到第2块。启动时nboot从flash读出eboot并执行之,如何就可以通过pb把nk.bin下载到目标板上执行了,开发机和目标板可以用交叉线直接连接。

NBOOT的结构以及生成方法

以前的nboot都是用ADS编译链接,简单明了。这次BSP包含的nboot是WinCE的工具链生成,结果出来的.nb0竟然有12KB,而三星的Steppingstone只有4KB,怎么剪裁涅?花了点时间把.log .map .rel .bib .bin .nb0仔细看了下,终于搞清楚12KB的nboot包含了些东西。
 
startup.s文件:
    OPT 2
    INCLUDE kxarm.h
    OPT 1
    OPT 128
    IMPORT main
    STARTUPTEXT
    LEAF_ENTRY StartUp
    b    main
    END
main.c文件:
    #include <windows.h>
    #include <pehdr.h>
    #include <romldr.h>
    ROMHDR * volatile const pTOC = (ROMHDR *)-1;
    static int gI1;
    static char *gBuf = "global str";
    static int gI2 = 2;
    int test(char *str)
    {
        int ret = 0;
        while(*str)
        {
            ret += *str++;
        }
        return ret;
    }
    void main(void)
    {
        gI1 = 1;
        test("is .rdata str?");
        test(gBuf);
    }

.map信息:
    Preferred load address is 00010000
    Start         Length     Name         Class
    0001:00000000 00000004H .astart       CODE
    0001:00000010 0000003bH .rdata        CODE
    0001:0000004c 00000024H .rdata$debug  CODE
    0001:00000070 0000004cH .text         CODE
    0001:000000bc 00000000H .edata        CODE
    0002:00000000 00000008H .data         DATA
    0002:00000008 00000004H .bss          DATA
    0003:00000000 00000008H .pdata        DATA
    entry point at        0001:00000000
其中
.rdata:pTOC、2个字符串
.data:gBuf、gI2
.bss:gI1

build.log信息:
Module    Section    Start    Length  psize  vsize   Filler
nk.exe     .text    00001000   4096    512    188   o32_rva=00001000
nk.exe     .pdata   00002000   4096    512      8   o32_rva=00003000
nk.exe     .data    000010bc      5      5     12   FILLER->33ff0000
nk.exe      E32     000010c4    112                 FILLER
nk.exe      O32     00001134     72                 FILLER
Module    Section    Start    Length  psize  vsize   Filler
nk.exe   FileName   0000117c      7                 FILLER
Unfilled ROM holes (address, length):
00002008     4088   00001184     3708  
total space 7796 in 2 ranges

结合.map信息可知:
.text包含:.astart .rdata .rdata$debug .text .edata,也就是0xBC(188)
.pdata包含:.pdata
.data包含:.data .bss,psize之所以是5,是因为"static int gI2 = 2"只占1B
注意:.bin文件的.text和.data节是连续的。

查看.bin的record info:
Image Start = 0x00000000, length = 0x00002008
Record [  0] : Start = 0x00000000, Length = 0x00000004, Chksum = 0x000001EB
Record [  1] : Start = 0x00000040, Length = 0x00000008, Chksum = 0x000001A5
Record [  2] : Start = 0x00000048, Length = 0x00000004, Chksum = 0x00000095
Record [  3] : Start = 0x00001000, Length = 0x00000184, Chksum = 0x000046D8
Record [  4] : Start = 0x00001184, Length = 0x00000054, Chksum = 0x000007B2
Record [  5] : Start = 0x000011D8, Length = 0x00000030, Chksum = 0x000008F6
Record [  6] : Start = 0x00002000, Length = 0x00000008, Chksum = 0x000000C3
Record [  7] : Start = 0x00000000, Length = 0x00001000, Chksum = 0x00000000
Start address = 0x00001000
Checking record #4 for potential TOC (ROMOFFSET = 0x00000000)
Found pTOC  = 0x00001184
ROMOFFSET = 0x00000000

用ADS反汇编展开后的.nb0:
0KB~4KB:REC[0]是 b 0x1000 跳转指令;REC[1/2]似乎是签名之类。
4KB~8KB:REC[3]包含所有Section(除.pdata外);REC[4]是ROMHDR;REC[5]未知
8KB~12KB:REC[6]是.pdata
REC[7]的Start和Chksum都是0,则Length指明EntryPoint。

假如不考虑重定位,把.nb0的0x1000开始的4KB烧入NAND Flash就大功告成了。
 

简化main.c文件:
    #include <windows.h>
    #include <pehdr.h>
    #include <romldr.h>
    ROMHDR * volatile const pTOC = (ROMHDR *)-1;
    void test(char * str)
    {
        while(*str)
        {
            *(volatile unsigned char *)0x1234 = *str++;
        }
    }
    void main(void)
    {
        test("Step ldr/r/n");
    }

.rel信息:
0003 0001 00001088 00000000
也就是0x1088处需要重定位。

用ADS反汇编展开后的.nb0:
    0x1064  ldr  r2,0x00001088 ; = #0x00000030
0x1088的值是0x30,根据.map文件可知0x1030存放字符串"Step ldr/r/n"

因此去掉.nb0的开始4KB页后,0x30就是字符串的地址。
假如把.bib文件中的,RAMIMAGE的Start和ROMSTART都从0->0x1000,则0x1088的值是0x2030,就不能去掉.nb0的开始4KB页

你可能感兴趣的:(Nboot与Eboot)