hardware 中的几个地址问题之二

、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、

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).在这里再将程序复制到外部内存中,在内部内存实现跳转到外部内存运行。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值