1、程序一开始是烧写到nandflash上,设置为nandflash启动,6410片内有8K的内存,设为nandflash启动时,是从片内内存0地址开始,一上电,nandflash前面8K的内容会原原本本的拷贝到6410前面内存的8k地址处,然后从0地址开始运行;如果烧写到nandflash上面的程序大于8k,不做其他处理则没办法运行。

所以要初始化DDR,把整个nandflash里面的程序拷贝到DDR里面去。

那么应该把程序复制到DDR哪儿呢?应该复制到它的链接地址。

W-D-S-链接地址_链接地址

之前的Makefile里面,-Ttext 0,表明该程序的链接地址是从0开始,所以当程序小于8K的时候,拷贝到6410前8k,从0地址开始,所以与链接地址对应,能够运行。

当程序超过8K的时候,要复制到DDR,那么要修改链接地址!

W-D-S-链接地址_链接地址_02

看看链接地址的作用:

一个程序会分成:

代码段:指令、数据段:有初始值且初始值不为零的全局变量,或静态变量、BSS段:初始值为零或无初始值的全局、静态变量

注意二进制文件里面是不存放BSS段的内容!!!!!!!!!!!!程序在启动的时候要把bss_start到bss_end里面的变量清零。

当链接地址为0时,

W-D-S-链接地址_全局变量_03

访问全局变量的时候用的是链接地址!

W-D-S-链接地址_链接地址_04

当链接地址为0x50000000

W-D-S-链接地址_全局变量_05

上面同一套程序,链接地址不一样,导致程序访问的全局变量也是使用的地址也不一样!

当从nandflash启动,把nandflash前8k复制到6410片内的前8K里面去,此时即使程序的链接地址是0x50000000,(注意:一个程序运行的时候“应该”位于它的链接地址。),由于这前面的程序使用的位置无关码编写的,所以不管链接地址为多少,它在任意地方都可以运行;它主要是使用b、bl来跳转,且不访问全局变量和静态变量。

当从nandflash启动,把nandflash前8k复制到6410片内的前8K里面去,当程序的链接地址是0x50000000时候,那么当程序复制到6410片内时要进行重定位,即程序自己要把自己拷贝到DDR里面的链接地址0x50000000,然后从6410片内调到DDR的链接地址运行。这样才会正确!!

重定位:把程序复制到它的链接地址处。

W-D-S-链接地址_静态变量_06

1)程序运行时,“应该”位于它的连接地址

2)硬件决定了程序一开始从0运行,需要重定位,即前面一小段代码把程序复制到它的链接地址处。

3)前面一小段代码为何能正常运行,因为他们是用位置无关码写的。