修改start.S,支持nand启动(2)

别急别急,,,小错而已..是吧....我们仔细查看,这是一个链接错误,为嘛会链接出错了..在此看到有这一行

start.o cpu_init.o lowlevel_init.o nand_boot.o nand_ecc.o s3c64xx.o

看到这一行,内心就暗自偷笑下吧..找到问题所在了...为啥?copy_uboot_to_ram这个函数不就是在start.o中内调用的嘛...所以这里没有nand_cp.o被链接进来,铁定

链接错误的...那要怎么改..直接定位到这个错误的目录下u-boot-2010.03/nand_spl/board/samsung/smdk6410修改该目录下Makefile 添加如下所示:

COBJS  = nand_boot.o nand_ecc.o s3c64xx.o nand_cp.o 后面得加上nand_cp.o 

接着我们得模仿后面的写法,为nand_cp.o添加目标生成方法

# from SoC directory

$(obj)cpu_init.S:

@rm -f $@

@ln -s $(TOPDIR)/cpu/arm1176/s3c64xx/cpu_init.S $@

$(obj)nand_cp.c:

@rm -f $@

@ln -s $(TOPDIR)/cpu/arm1176/nand_cp.c $@

至此,,编译应该就没有问题啦....

难不成这就行了???你下载进去试试不就知道了...

不行?运行不了?为什么呢....首先我们分析下,启动的过程...arm上电之后开始0地址指令..0地址的指令(此处假设时钟是nand启动,,这里就是讨论这个问题)是由arm自主加载的..从nand

的前8k,那么前8K的代码也就是0---0x2000 的这一段了..在start.S 这个文件,我们都知道是第一条指令的位置,那么这个文件就必须要被拷贝到0地址对应起来咯...这样才能被正常执行.

这些是不是都同意呢?不同意....咱们私下讨论.联系我...同意的,咱们继续.往下分析

既然知道了start.s为开始的地方,那么这里面也是第一部分的引导代码,而大家都知道第一部分的代码其实不全的,,,启动部分只有一下部分被arm搬移,剩余的大部分其实还在nand中..

那么既然不全,也就是跳转啊,函数调用啊...都必须在0---0x2000 的位置内才能到访问到.而且还不能是跟符号相关的跳转.因为符号跳转是根据链接地址跳转的..链接地址大家应该都知道

是被链接到一个很高的内存地址处去了...0x5e000啥的那个地址...

继续啊...不能符号跳转,就必须是相对跳转了...只要保证第一部分中所有的函数调用,符号跳转都在0---0x2000中,那就没问题,正常执行....为此,我们看一下u-boot.map这个文件.发现一个问题

Linker script and memory map

0x00000000 . = 0x0

0x00000000 . = ALIGN (0x4)

.text 0x57e00000 0x262a4

cpu/arm1176/start.o(.text)

.text 0x57e00000 0x440 cpu/arm1176/start.o

0x57e00000 _start

0x57e00040 _end_vect

0x57e00048 _armboot_start

0x57e0004c _bss_start

0x57e00050 _bss_end

0x57e0010c copy_from_nand

cpu/arm1176/s3c64xx/cpu_init.o(.text)

.text 0x57e00440 0x124 cpu/arm1176/s3c64xx/cpu_init.o

0x57e00440 mem_ctrl_asm_init

我们只看一小部分了....在这里我们看到_start符号地址正好是那个指定的链接地址..也就是代码的起始符号...地址很高..无所谓啦...我们看看start.S中都有哪些符号的调用吧..这里直接看这个符号吧

.text 0x57e1c268 0x1fc board/samsung/smdk6410/libsmdk6410.a(lowlevel_init.o)

0x57e1c26c lowlevel_init

这个符号其实在strat.S中是要使用的,,那么在仔细一看这个地址挺高的,,,好像不在前8k中是吧...那么在执行的时候就找不到这个符号的代码了...

问题就是在这,,得确保第一部分需要用到的代码能被arm加载进前8k就好了....那就得需要告诉连接器,,你...就你..帮我把这个链接到前面去.别放后面...不然打你...

链接器就会帮你乖乖的链接上去了...至于链接怎么听话,那就得使用链接听得懂的话了...链接脚本....使用哪个链接脚本..自己看我前面的分析文档吧....

cpu/arm1176/u-boot.lds

SECTIONS

{

. = 0x00000000;

. = ALIGN(4);

.text :

{

cpu/arm1176/start.o (.text)

board/samsung/smdk6410/lowlevel_init.o (.text)

cpu/arm1176/s3c64xx/cpu_init.o (.text)

cpu/arm1176/nand_cp.o (.text)

*(.text)

}

只列出了被修改的部分...

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:http://www.heiqu.com/9504a609070ad7b178a040cb9dc3d5a8.html