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指定的地址相差很远,也是可以执行的!