nboot, eboot
2008-09-08 18:49

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

nboot是nand flash bootloader的意思。S3C2410可以直接从nand flash 启动,但是不能超过4k。nboot是系统启动后最先执行的代码,它有两种,一种是跳转到eboot;一种是跳转到nk。 主要的功能其实是在eboot里。

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 (Nand flash bootloader) 主要的作用就是初始化硬件,把后面的功能比较完善的引导程序像eboot之类的映像拷贝到SDRAM中让后跳到SDRAM中继续跑eboot。

为什么要有nboot这个东西呢,其实主要是因为现在的soc上考虑到成本的问题,基本是都是自带一个nand flash的控制器并支持开机nand flash引导来取代相对来说昂贵的nor flash。

一般来说nand flash的控制器都会内置一个SRAM之类的buffer来支持nand flash的开机引导,在nand启动的方式下,板子上电的时候,nand控制器会自动把nand flash最前面的buffer大小的数据自动拷贝到buffer(SRAM)中然后让pc指针可以从buffer中直接读取指令。一般来说这个buffer不会很大,2410的芯片是4k,而像freescale的imx21更是只有2k,所以由于这个局限性,我们只能把bootloader拆分成两部分,前面一部分来完成基本初始化功能,而后面一部分来完成比较完善的功能,让控制器自动拷贝前一部分,然后前一部分再拷贝后一部分到RAM中,这样引导程序就可以做任何它想做的事情了。

其实,实现一个nboot并没有多大难度,以下是一个大概流程:

1.       当然是配置时钟了,没这个系统跑不起来啊 o(∩_∩)o…

2.       不用说SDRAM的配置也是少不了,不然我们怎么把程序拷贝到SDRAM中。

3.       就是flash控制器的配置了,一般来说就是GPIO和相应的控制器寄存器配一下。

4.       拷贝文件从nand到SDRAM中,nand flash读的话一般来说都是先拉片选位,然后发命令,接着是地址,最后就是读数了。

上面几步做完,其实整个nboot也就差不多了,不过在WinCE下开发的话有几个点需要特别注意:

1.       因为要用PB来编译,所以为了能生成.nb0文件,所以一定要在 代码里加上:

pTOC    DCD   -1

EXPORT pTOC

这个是让ROMIMG.exe做image时用的.

2.       生成.nb0文件,bib文件也是不能少的。

3.       因为微软编译器的原因,导致了我们按一般方法来编译.nb0时,前面的4K都是空的,所以如果直接把编译出来的.nb0烧进去的话是不能用的,所以的在bib改一下:

把: NBOOT 00000000 00002000 RAMIMAGE 这个定义成8k的大小,然后后面的

ROMSTART=00001000

ROMSIZE=1000

把start地址往后移一下,然后大小改为4k,这样出来的nb0就会 把前面空的4k给截掉了。

以上的都做完的话,基本上应该不会有什么问题了。

NBoot EBoot相关推荐

  1. WINCE6.0 + S3C2443的启动过程---nboot篇

    WINCE6.0 + S3C2443的启动过程---nboot篇 我们启动WINCE6.0的方式是:nboot+eboot+NK.那么是如何启动WINCE6.0系统映像的呢?首先是nboot把eboo ...

  2. 【原创】关于noot的学习笔记

    预备文章 //-----------------------------------------------------------------------// <Nboot程序详细分析> ...

  3. nboot,eboot和uboot

    nboot,eboot和uboot三者均为bootloader. ----nboot是samsung系列cpu为了能将前4KB程序复制到SRAM中运行,而在wince写的.nboot很小(4k左右), ...

  4. nboot通过DNW下载并运行eboot.nb0

    1.       在stepldr/main.c下面的mian函数调用Uart_Init()对串口的初始化 我们使用UART1来作为debug口. 2.       实现nboot通过串口下载并运行e ...

  5. Nboot与Eboot

    nboot和Eboot的说明和调用方式 nboot是从NAND   flash读image到内存并执行,eboot是从以太网(用tftp)下载image到内存并执行.将nboot.nb0烧到第0块,将 ...

  6. nboot,eboot和uboot的区别

    nboot,eboot和uboot三者均为bootloader. ----nboot是samsung系列cpu为了能将前4KB程序复制到SRAM中运行,而在wince写的.nboot很小(4k左右), ...

  7. nboot和eboot

    nboot是从NAND flash读image到内存并执行,eboot是从以太网(用tftp)下载image到内存并执行.将nboot.nb0烧到第0块,将eboot.nb0烧到第2块.启动时nboo ...

  8. NBOOT、EBOOT、UBOOT介绍

    nboot很小(4k左右),一般用在从nandflash启动的情况,nandflash不支持就地执行,所以必须有一个可以执行的程序将烧写在其中的eboot搬到内存中,nboot就是干这个的.nboot ...

  9. Eboot 中给nandflash分区实现

    提到分区就不得不提到MBR,不得不提到分区表. 什么是MBR 硬盘的0柱面.0磁头.1扇区称为主引导扇区,NANDFLASH由BLOCK和Sector组成,所以NANDFLASH的第0 BLOCK,第 ...

最新文章

  1. python爬虫一般格式
  2. 串口端口被占用的解决方法
  3. pack unpakc
  4. ITK:将网格转换为非结构化网格
  5. Spark性能优化指南——高级篇
  6. put多文件上传linux,linux 上传lftp 服务器
  7. 基于java的打砖块游戏_cocos creator 制作的打砖块游戏
  8. Microsoft Edge 81 稳定版发布
  9. 10.C++-构造函数初始化列表、类const成员、对象构造顺序、析构函数
  10. java 对象的强制类型转换
  11. [Java] 自己写了个随机抽签器
  12. 如何用css设置文字加粗,css如何设置文字加粗
  13. at android.widget.Toast$TN.handleShow(Toast.java:501)自定义布局异常
  14. 某60终端安全管理系统前台SQL注入漏洞复现
  15. 华为云学院学习文档如何下载
  16. 无线网络dns服务器设置,无线网络的dns怎么设置才正确
  17. 书写NDIS过滤钩子驱动实现ip包过滤
  18. flask导入mysql数据库_flask 数据库报错
  19. python常用写法
  20. “寻找下一代CTO”-- 机会啊

热门文章

  1. 通过数据库存储过程调用Web服务的办法
  2. 【Django毕业设计源码】Python旧衣物捐赠系统的设计与实现
  3. APT34泄密武器分析报告
  4. 计算机学科论文期刊,计算机学科期刊文章参考文献 计算机学科论文参考文献数量是多少...
  5. 【影像学基本知识】MR----T1,T2
  6. 云IDE:Coding的Cloud Studio
  7. Failed to load resource: the server responded with a status of 416 (Requested Range Not Satisfiable)
  8. Java包名如何命名
  9. 全球与中国磨料水射流切割机市场深度研究分析报告
  10. 做自适应网站专业乐云seo_自适应网站软件专注乐云seo