永发信息网

NBOOT是什么意思

答案:1  悬赏:10  手机版
解决时间 2021-02-03 03:55
请问是什么意思谢谢
最佳答案
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
  #include
  #include
  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
  #include
  #include
  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中然后让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给截掉了。

  以上的都做完的话,基本上应该不会有什么问题了。
我要举报
如以上问答信息为低俗、色情、不良、暴力、侵权、涉及违法等信息,可以点下面链接进行举报!
大家都在看
武陟县詹店镇第一中学地址在哪,我要去那里办
三十三天的意思是什么啊?知道的请说下!
池州学院怎么去啊,有知道地址的么
你好,想问下私自贩卖柴油,最近被拘留,会构
武陟县谢旗营镇第二中学地址在什么地方,我要
下列水溶液沸点最高的是:A.0.1mol/LCHOB.0
众泰5008这款车怎么样,要详细点的
武陟县北郭乡第四中学地址有知道的么?有点事
避灶的意思是什么啊?知道的请说下!
星汇力健身美容会所花都店在什么地方啊,我要
【预算员报考条件】预算员报考条件是什么?
河蟹饲料怎么样
武陟县北郭乡第三中学地址在什么地方,我要处
我和你老婆是二婚,她和孩子的户口都不在我这
建大彩钢钢构工程公司怎么去啊,有知道地址的
推荐资讯
用感觉尿憋的很难受但去尿又一点点尿完马上又
为什么有的男性会极其讨厌一切与他同性的人
【捧着】捧着的意思是什么?谁先谁采纳!!
如何用水果酿酒
恨愤的意思是什么啊?知道的请说下!
沈小福地址有知道的么?有点事想过去
听说共享纸巾是免费的,有用过的人知道它的纸
G220/环南路(路口)怎么去啊,有知道地址的么
埃及鱼最喜欢吃什么
这种猫叫什么名字?
沁园馨城在哪里啊,我有事要去这个地方
结合课文内容,发挥你的想象,以“阿长买《山海
正方形一边上任一点到这个正方形两条对角线的
阴历怎么看 ?