首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 嵌入开发 > 驱动开发 >

NandFlash启动时代码段起始地址有关问题.

2013-03-21 
NandFlash启动时代码段起始地址问题...看韦东山的书上说,用nand启动则是复制nand的前4K到片内RAM中,接着从

NandFlash启动时代码段起始地址问题...
看韦东山的书上说,用nand启动则是复制nand的前4K到片内RAM中,接着从0地址开始执行,然后复制这段到SARAM,跳转到0x30000000执行,但是为什么makefile中是

arm-linux-ld -Ttext 0x30000000 head.o leds.o -o sdram_elf

即代码段起始地址在0x30000000?为什么?开头代码不是在0x0执行,然后初始化完毕才自动跳到0x300000000,这句到底有什么用?

[解决办法]
用nand启动则是复制nand的前4K到片内RAM中,这是一级loader;
这4k空间放不下操作系统,甚至是Bootloader(例如uboot),所以常见做法是在这段代码里面实现一个二级Loader,该二级loader的目的是用来初始化dram,并将体积较大的程序搬到dram中执行;
你说的0x30000000应该是dram的首地址;

地址0是二级loader运行的起始地址,如果用户的应用程序小于4k,也可以不需要二级loader,直接放在这 4K里面运行;

[解决办法]
嗯,请问你所说的bootloader是哪种呢?

三星的很多soc的NAND起动是这样来做的:
IROM => 片内RAM(通常4~8KB) => SDRAM
IROM:是一段固化在片内的程序,能以最基本的方式驱动NAND,从中复制4~8KB的内容到片内RAM
片内RAM:即一级loader,需要完成CPU时钟初始化以加快引导过程;初始化SDRAM以获取更大的运行内存;将完整的bootloader加载到SDRAM运行。
SDRAM:进行详细的初始化,引导内核等。

标准在u-boot中是这样来做的:
在/nand_spl/board目录里有专门的makefile用于生成起动所使用的一级loader(u-boot-nand-spl.bin),在这个makefile中会使用新的新和-Ttext参数。
使用cat命令将生成的u-boot-nand-spl.bin附加到u-boot.bin前面,形成新的u-boot-nand.bin
具体请参考根目录makefile中%(obj)u-boot-nand.bin目标。

非标准的u-boot中:
这里不使用/nand_spl/中的一级loader。这需要一定的技巧以保证u-boot在跳转到-Ttext指定的地址运行前不会出错。因为对于ARM指令来说,有很多指令对操作数的处理都是基于当前PC值计算得来的,所以,只要处理得当,即使当前PC与-Ttext指定的地址相差很远,也是可以执行的!

热点排行