、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、
SECTIONS {
. = 0x30000000;
.text : { *(.text) }
.rodata ALIGN(4) : {*(.rodata)}
.data ALIGN(4) : { *(.data) }
.bss ALIGN(4) : { *(.bss) *(COMMON) }
}
、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、
。。。
ldr pc, =on_sdram @跳转到sdram中继续执行
on_sdram:
。。。
、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、
Bootloader,内核等程序刚开始执行时,它们所处的地址通常不等于运行地址。在程序的开头先使用b,bl,mov等“位置无关”指令将代码从Flash中复制到内存的“运行地址”。然后再跳到“运行地址”执行代码。
、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、
SECTIONS {
firtst 0x00000000 : { head.o init.o }
second 0xB0004000 : AT(2048) { leds.o }
}
、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、
0x30000000,0x00000000.,0xB0004000这里是程序的运行地址,AT(2048)则是指定了另外一段代码在映象文件中的地址,(这里是不是可以理解为下载到开发板的nand flash中的地址呢?)。运行地址影响pc寄存器(个人理解哈)。上例中:在ldr pc, =on_sdram @跳转到sdram中继续执行。这条指令前的指令已经将代码复制到了内存,由于连接脚本指定了运行地址,故此处pc的值为:0x30000000 + on_sdram的偏移地址,跳转到内存的on_sdram中去执行了。而不是还在原地继续执行下一条 on_sdram:。
、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、
总结:
flash中的程序不管你指定的运行地址是哪里,首先自动被复制到内部ram中运行,(steppingstone).在这里再将程序复制到外部内存中,在内部内存实现跳转到外部内存运行。