pansiyi
驱动牛犊
驱动牛犊
  • 注册日期2006-02-26
  • 最后登录2009-12-16
  • 粉丝0
  • 关注0
  • 积分193分
  • 威望50点
  • 贡献值0点
  • 好评度19点
  • 原创分0分
  • 专家分0分
阅读:3574回复:15

请教BIN和NB0文件的加载

楼主#
更多 发布于:2007-09-14 10:08
1.      我自己写了一个BOOTLOADER要加载EBOOT,我的PB生成了两个一个是EBOOT.BIN和EBOOT.NB0我发现这两个程序头上都不是可以执行的代码,好像是控制信息,请教教如何用我的BOOTLOADER把EBOOT加载到SDRAM中(假设是0X30000000)我应该跳到哪里个地址去,才可以跑起我的EBOOT,希望两种文件的加载方式都给我讲下,还有加载NK.BIN和NK.NB0是不是也是一样的道理?
2.      还有PB下有没有什么文件是类似与ADS下RO的作用的?
3.      EBOOT和CE系统是相互独立的吗?(即EBOOT中没有CE的依赖,PB没有将CE启动的一些东西加入到EBOOT中)
4.      不知道有没有什么资料讲如何从BOOTLOADER开始到CE加上去的,要稍微详尽一点,可以解决上面问题的,希望大家介绍本给我
pansiyi
驱动牛犊
驱动牛犊
  • 注册日期2006-02-26
  • 最后登录2009-12-16
  • 粉丝0
  • 关注0
  • 积分193分
  • 威望50点
  • 贡献值0点
  • 好评度19点
  • 原创分0分
  • 专家分0分
沙发#
发布于:2007-09-15 11:44
我从新添加了EBOOT就只有一个
main.c:
#define rUTRSTAT1   (*(volatile unsigned *)0x50004010)
#define UART_STATUS     rUTRSTAT1
#define WRITE_UART      WrUTXH1
#define WrUTXH1(ch) (*(volatile unsigned char *)0x50004020)=(unsigned char)(ch)
void Delay(int time)
{
      // time=0: adjust the Delay function by WatchDog timer.
      // time>0: the number of loop time
      // resolution of time is 100us.
    int i;
    for(i=0;i<1000;i++);
}
void main(void)
{
    while(1)
    {
        if(UART_STATUS & 0x2)
        {
            Delay(1);
            WRITE_UART('p');
        }
    }
    WRITE_UART('s');
}

boot.bib:
MEMORY
;   Name     Start     Size      Type
;   -------  --------  --------  ----
    DRV_GLB  30020000  00001000  RESERVED
    BIN_FS   30021000  00005000  RESERVED
    RAM      30026000  00006000  RAM
    STACK    3002c000  00004000  RESERVED
    EBOOT    30038000  00020000  RAMIMAGE
;    EBOOT    8c038000  00040000  RAMIMAGE

    ; 16 MB area used to cache nk.bin while programming boot media.
    ; TBD: we may need to adjust to 01400000 (20 MB) to cache PPC 2003.
    FLSCACHE 8D000000  01000000  RESERVED

CONFIG
    COMPRESSION=OFF
    PROFILE=OFF
    KERNELFIXUPS=ON
    SRE=ON
    ROMSTART=30000000
    ROMWIDTH=32

    ; N.B: boot media block size aligned
    ROMSIZE=16000

MODULES
;   Name            Path                                            Memory Type
;   --------------  ----------------------------------------------  -----------
    nk.exe $(_TARGETPLATROOT)\target\$(_TGTCPU)\$(WINCEDEBUG)\EBOOT.exe EBOOT
sources:
!if 0
Copyright (c) Microsoft Corporation.  All rights reserved.
!endif
!if 0
Use of this source code is subject to the terms of the Microsoft end-user
license agreement (EULA) under which you licensed this SOFTWARE PRODUCT.
If you did not accept the terms of the EULA, you are not authorized to use
this source code. For a copy of the EULA, please see the LICENSE.RTF on your
install media.
!endif
!IF 0


Module Name:

    sources.

Abstract:

    This file specifies the target component being built and the list of
    sources files needed to build that component.  Also specifies optional
    compiler switches and libraries that are unique for the component being
    built.

!ENDIF

SYNCHRONIZE_DRAIN=1

TARGETNAME=EBOOT
TARGETTYPE=PROGRAM
WINCECPU=1
TARGETLIBS=
RELEASETYPE=PLATFORM
WINCETARGETFILES=$(_RELEASEDIR)\$(TARGETNAME).nb0
EXEENTRY=main
EXEBASE=0x80000000

INCLUDES=..\inc;$(_PUBLICROOT)\common\oak\drivers\block\msflashfmd\inc
#INCLUDES=$(_TARGETPLATROOT)\eboot\inc;$(INCLUDES)
INCLUDES=$(_TARGETPLATROOT)\Drivers\NandFlsh\FMD;$(INCLUDES)
ADEFINES=-pd "ALLOCATE_TABLE SETS \"FALSE\"" $(ADEFINES)

LDEFINES=-subsystem:native /DEBUG /DEBUGTYPE:CV /FIXED:NO
CDEFINES= $(CDEFINES) -DPPSH_PROTOCOL_NOTIMEOUT -DCOREDLL -DPLAT_ONBOARDEDBG=1 -DBOOT_LOADER=1 -DNOSYSCALL=1

SOURCES=        \
    main.c      \
发现我编译的EBOOT.NB0文件头字样是FE0300EA,好像是一条跳转到加载地址+0X00001000的语句,我现在把EBOOT.NB0放到内存30038000的位置,并跳入真的跳转到0X30039000的位置了,为什么没有看到串口信息呢?(我前面的BOOT里对串口已经初始化好了,而且我用ADS编译后加载这个文件也是可以正常运行的)
pansiyi
驱动牛犊
驱动牛犊
  • 注册日期2006-02-26
  • 最后登录2009-12-16
  • 粉丝0
  • 关注0
  • 积分193分
  • 威望50点
  • 贡献值0点
  • 好评度19点
  • 原创分0分
  • 专家分0分
板凳#
发布于:2007-09-15 13:34
通过测试我觉得大概是我的EBOOT。NB0在偏移0X00001000的位置不是我EBOOTmain函数的入口,是不是我PB中BOOT.BIB的文件设置不对?请懂的人指导我下啊
microsun
论坛版主
论坛版主
  • 注册日期2002-11-11
  • 最后登录2014-07-18
  • 粉丝0
  • 关注0
  • 积分1052分
  • 威望1159点
  • 贡献值0点
  • 好评度848点
  • 原创分0分
  • 专家分0分
地板#
发布于:2007-09-15 17:29
1,EBOOT与OS没有关系,当它把OS下载以后,跳到OS的第一条指令去执行,EBOOT的使命就已经完成,当然,它可以给OS传递一些参数,影响OS的行为.
2,EBOOT的第一条语句是不是指令我不记得,但如果前面有一部分不是指令,则第一条语句一定是一条跳转指令,跳到0X1000,而0x1000也不是main的地址,在main之前有很多汇编指令
学海无涯
pansiyi
驱动牛犊
驱动牛犊
  • 注册日期2006-02-26
  • 最后登录2009-12-16
  • 粉丝0
  • 关注0
  • 积分193分
  • 威望50点
  • 贡献值0点
  • 好评度19点
  • 原创分0分
  • 专家分0分
地下室#
发布于:2007-09-15 19:02
你所说的“在main之前有很多汇编指令”但是我的EBOOT里面没有加相应的代码啊,对了,我刚刚看到有个说到EBOOT的,是不是要加一个类似于Startup.s的文件?然后跳转到MAIN函数的入口呢?
microsun
论坛版主
论坛版主
  • 注册日期2002-11-11
  • 最后登录2014-07-18
  • 粉丝0
  • 关注0
  • 积分1052分
  • 威望1159点
  • 贡献值0点
  • 好评度848点
  • 原创分0分
  • 专家分0分
5楼#
发布于:2007-09-16 11:32
一般都是有一个叫startup.s的文件,第一条指令应该就在这个文件中,

初始化一下SDRAM,CLOCK等必须的东西,设置SP,就可以调用MAIN了.
学海无涯
pansiyi
驱动牛犊
驱动牛犊
  • 注册日期2006-02-26
  • 最后登录2009-12-16
  • 粉丝0
  • 关注0
  • 积分193分
  • 威望50点
  • 贡献值0点
  • 好评度19点
  • 原创分0分
  • 专家分0分
6楼#
发布于:2007-09-16 13:08
这个文件我是在自己的BOOT下用的,而且我自己的BOOT已经“初始化一下SDRAM,CLOCK等必须的东西,设置SP”,我通过ADS编译通过烧到板子上了俄,现在我就是要用自己的BOOT加载EBOOT.NB0,但是EBOOT起不来,估计是PB编译的问题,是不是缺少你说的startup.s?怎么样才可以联系你,论坛上等你回复有点慢呵呵,我的QQ397241205,邮箱pansiyi0907@163.com
dillonhua
驱动小牛
驱动小牛
  • 注册日期2004-07-30
  • 最后登录2016-01-09
  • 粉丝0
  • 关注0
  • 积分36分
  • 威望401点
  • 贡献值0点
  • 好评度128点
  • 原创分0分
  • 专家分0分
7楼#
发布于:2007-09-16 14:05
EBOOT的头是一个tag标记用来告示板子里的BOOTLOADER目前下的是一个什么类型的img,BOOTLOADER就是通过这些标记来区分当前下的是EBOOT还是NK等等其他的,如果是EBOOT的话又分为eboot.bin和eboot.nb0,eboot.nb0是由eboot.exe经过roamimg.exe得来的,他的最开始是一个标记,后面会有ECEC以及文件大小,下载运行地址这样的标示,这些信息都是在你的EBOOT。BIB里面定义的,而eboot.bin则会包括B000FF等这样的标记,以及下载地址,跳转地址,文件大小等。

   如果你的bootloader要加载EBOOT。NB0,则只需要将0x1000开始的内容拷贝到内存的某个地址,注意不要和startup.s里的自拷贝地址有重合的机会,然后跳转到那个地址去执行,应该就可以了

  如果你加载的是eboot.bin,则需要记录下文件头所包含的跳转地址和执行地址,所做的工作就是把eboot.bin从NAND拷贝到下载地址,然后指针指向执行地址去执行,就可以了,对于NK.BIN的加载也是这样的
pansiyi
驱动牛犊
驱动牛犊
  • 注册日期2006-02-26
  • 最后登录2009-12-16
  • 粉丝0
  • 关注0
  • 积分193分
  • 威望50点
  • 贡献值0点
  • 好评度19点
  • 原创分0分
  • 专家分0分
8楼#
发布于:2007-09-16 14:28
恩我也是按照你说的方法,加载EBOOT.NB0的,我把整个EBOOT.NB0加到0X30038000,然后跳到这个地址,我发现EBOOT.NB0的第一个跳指令执行的是,它的执行地址+偏移0X1000,也就是说事0X30039000这个位置执行,也就事你说的“则只需要将0x1000开始的内容拷贝到内存的某个地址,注意不要和startup.s里的自拷贝地址有重合的机会,然后跳转到那个地址去执行,应该就可以了”,但是它好像跑飞了,于是我自己在它上面加了就是通过串口回显,但是还是没有反映的,估计这个EBOOT根本就没有在MAIN函数的入口开始跑起来
pansiyi
驱动牛犊
驱动牛犊
  • 注册日期2006-02-26
  • 最后登录2009-12-16
  • 粉丝0
  • 关注0
  • 积分193分
  • 威望50点
  • 贡献值0点
  • 好评度19点
  • 原创分0分
  • 专家分0分
9楼#
发布于:2007-09-16 15:19
“eboot.nb0是由eboot.exe经过roamimg.exe得来的,他的最开始是一个标记,后面会有ECEC以及文件大小,下载运行地址这样的标示,这些信息都是在你的EBOOT。BIB里面定义的,而eboot.bin则会包括B000FF等这样的标记,以及下载地址,跳转地址,文件大小等。”


这两个文件包含的上述信息,你可以给我仔细说下吗?我了解过,但是它只是说它的段地址,大小,至于你说的加载地址,我就不清楚了,或者,你给我指点下哪里去找资料了解
dillonhua
驱动小牛
驱动小牛
  • 注册日期2004-07-30
  • 最后登录2016-01-09
  • 粉丝0
  • 关注0
  • 积分36分
  • 威望401点
  • 贡献值0点
  • 好评度128点
  • 原创分0分
  • 专家分0分
10楼#
发布于:2007-09-16 15:29
教你一个方法,打开一个eboot.bin或者eboot.nb0文件,然后和eboot.bib进行比较,就知道你的eboot.bib里面定义的地址是存放在包头的什么位置了,或者找个BSP看别人是如何对包头进行解析的
dillonhua
驱动小牛
驱动小牛
  • 注册日期2004-07-30
  • 最后登录2016-01-09
  • 粉丝0
  • 关注0
  • 积分36分
  • 威望401点
  • 贡献值0点
  • 好评度128点
  • 原创分0分
  • 专家分0分
11楼#
发布于:2007-09-16 15:34
引用第8楼pansiyi于2007-09-16 14:28发表的  :
恩我也是按照你说的方法,加载EBOOT.NB0的,我把整个EBOOT.NB0加到0X30038000,然后跳到这个地址,我发现EBOOT.NB0的第一个跳指令执行的是,它的执行地址+偏移0X1000,也就是说事0X30039000这个位置执行,也就事你说的“则只需要将0x1000开始的内容拷贝到内存的某个地址,注意不要和startup.s里的自拷贝地址有重合的机会,然后跳转到那个地址去执行,应该就可以了”,但是它好像跑飞了,于是我自己在它上面加了就是通过串口回显,但是还是没有反映的,估计这个EBOOT根本就没有在MAIN函数的入口开始跑起来



不要加到0x30038000这个地址,加到另外的地址,比如0x30038000+256K的一个地址试试
pansiyi
驱动牛犊
驱动牛犊
  • 注册日期2006-02-26
  • 最后登录2009-12-16
  • 粉丝0
  • 关注0
  • 积分193分
  • 威望50点
  • 贡献值0点
  • 好评度19点
  • 原创分0分
  • 专家分0分
12楼#
发布于:2007-09-16 16:46
我按照你说的方法加载过,但是还是跟原来的情况一样的,然后我有比较BIB中的文件
MEMORY
;   Name     Start     Size      Type
;   -------  --------  --------  ----
    DRV_GLB  8c020000  00001000  RESERVED
    BIN_FS   8c021000  00005000  RESERVED
    RAM      8c026000  00006000  RAM
    STACK    8c02c000  00004000  RESERVED
    EBOOT    8c038000  00020000  RAMIMAGE
;    EBOOT    8c038000  00040000  RAMIMAGE

    ; 16 MB area used to cache nk.bin while programming boot media.
    ; TBD: we may need to adjust to 01400000 (20 MB) to cache PPC 2003.
    FLSCACHE 8D000000  02100000  RESERVED

CONFIG
    COMPRESSION=OFF
    PROFILE=OFF
    KERNELFIXUPS=ON
    SRE=ON
    ROMSTART=8c038000
    ROMWIDTH=32

    ; N.B: boot media block size aligned
    ROMSIZE=16000

MODULES
;   Name            Path                                            Memory Type
;   --------------  ----------------------------------------------  -----------
    nk.exe $(_TARGETPLATROOT)\target\$(_TGTCPU)\$(WINCEDEBUG)\EBOOT.exe EBOOT
上面这个代码中只有EBOOT    8c038000  00020000  RAMIMAGE中的8c038000在EBOOT.BIN文件中的第8个二进制文件对着的哦

还有EBOOT下sources文件中EXEENTRY这个值是不是也有影响?
pansiyi
驱动牛犊
驱动牛犊
  • 注册日期2006-02-26
  • 最后登录2009-12-16
  • 粉丝0
  • 关注0
  • 积分193分
  • 威望50点
  • 贡献值0点
  • 好评度19点
  • 原创分0分
  • 专家分0分
13楼#
发布于:2007-09-16 17:14
我发现BIB文件中EBOOT的地址是不会改变EBOOT.NB0文件的编译的好像,所以我个人觉得EBOOT.NB0应该就是一个执行的代码,没有什么控制信息的,只要放到内存,然后跳入就可以跑了,但是问题是为什么我的EBOOT中就事只有一句对串口的写操作回显到超级终端下都没有执行呢(我前面的BOOT已经对串口初始化了)
pansiyi
驱动牛犊
驱动牛犊
  • 注册日期2006-02-26
  • 最后登录2009-12-16
  • 粉丝0
  • 关注0
  • 积分193分
  • 威望50点
  • 贡献值0点
  • 好评度19点
  • 原创分0分
  • 专家分0分
14楼#
发布于:2007-09-16 18:05
\WINCE420\PRIVATE\WINCEOS\COREOS\NK\KERNEL\MIPS这个路径下的startup.s会不会是控制EBOOT。NB0中main函数的入口的?好像EBOOT下sources文件中EXEENTRY=StartUp是不是这个意思?
pansiyi
驱动牛犊
驱动牛犊
  • 注册日期2006-02-26
  • 最后登录2009-12-16
  • 粉丝0
  • 关注0
  • 积分193分
  • 威望50点
  • 贡献值0点
  • 好评度19点
  • 原创分0分
  • 专家分0分
15楼#
发布于:2007-09-18 18:07
大侠们给点反映啊
游客

返回顶部