代码的加载地址与运行地址

原创 2012年03月24日 18:01:32
下面内容是技术讨论群里的读者的提问:
问:
程序下载到NOR中,在ADS中加载地址却是0x30000000,是SDRAM的地址,难道是调试器自动搬运的?

答:
一个地址是加载 地址一个是运行地址不一样的
你下载到Nor里,是加载地址,ADS里ROBase设置的是运行地址

问:

加载地址是从0开始的吧

答:
Yes

问:
是谁将其复制到RAM中的啊?
ARM核吗?

答:
你所谓的复制是什么意思?
你的代码不复制,没有人会帮忙的

问:
NOR里的代码可以直接运行的啊

答:
是啊
ARM上电就从0开始执行
所以直接运行啊

问:
那那个0x30000000起什么作用?
我要是写成0.。。

答:
那是运行地址,意思是说,代码将来要运行在以这个地址为基地的空间里
所以,运行地址和加载地址可以不一样
所以,运行地址和加载地址不一样的地方,只能用相对跳转

问:
我可不可以这样理解,不超过NOR的容量的代码,那个运行地址意义不大.

答:
你对运行地址和加载地址的概念理解的不深刻

问:
是的

答:
我们的C和汇编要编译成二进制对吧
编译器会把C代码和汇编在链接的时候要给定每一条指令,变量,函数的地址

问:
是的

答:
那这个地址是固定的
这个地址的基址就是运行地址
也就是说,代码在运行的时候,都是在运行地址空间里运行的
但是,通常在嵌入式设备里
内存是需要先初始化的,没有初始化不能使用,代码也就不能运行在里面,而我们编译的二进制文件又是烧写到了Nor之类的ROM里
这样,所以我们要将代码从NOR里搬运到SDRAM里
保证正常运行
所以我们只能将代码的运行地址设置为SDRAM里的一个地址
而烧写的时候的地址,是加载地址

问:
运行地址是作为参数给编译器是这样吧?

答:
只要你保证在NOR里,没有绝对地址跳转就可能运行
但是并不是所有的代码都使用相对跳转的
所以,这也必须要求你的代码搬运到SDRAM里
上面 你说的很对

问:
嗯,谢谢

答:
因为编译器要知道地址后,在你的运行地址基础上编址
你可以将运行地址设置为0x30000000
然后将其在ADS里右键反汇编,看看其指令的地址就知道了

问:
好的

答:
然后你再将运行地址设置为0x0
再反汇编,对比一下,你就理解了
这个理解了,你也就理解了,什么是PIC代码了
你自己去调查一下吧
版权声明:本文为博主原创文章,未经博主允许不得转载。

关于加载地址和运行地址理解

这几天在看uboot的汇编部分,唯一觉得有点弄不懂的就是存储地址和运行地址了,网上看了很多文章,最后还是没有完全通透,云里雾里的,昨晚看了这篇帖子突然恍然大悟,特来谈谈个人的想法,不对的地方还请朋友们...
  • yanlutian
  • yanlutian
  • 2016年09月02日 15:35
  • 1431

运行地址、链接地址、加载地址、存储地址

转载来源http://baiyouabc.blog.163.com/blog/static/243357014201522792735320/ 1、概念理解 运行地址链接地址:他们两个是等价的,只是两...
  • qingkongyeyue
  • qingkongyeyue
  • 2016年08月24日 11:48
  • 1937

汇编运行地址,链接地址,加载地址,存储地址 位置无关码、位置有关码

搞ARM开发时,在连接目标代码会提到运行地址和加载地址。这两者有什么区别呢?其次,网上也有说链接地址和存储地址,那么这四个地址之间有什么区别? 1、运行地址链接地址:他们两个是等价的,只是两种不...
  • shanzhizi
  • shanzhizi
  • 2014年08月05日 16:39
  • 5567

运行地址,链接地址,加载地址,存储地址 位置无关码、位置有关码

搞ARM开发时,在连接目标代码会提到运行地址和加载地址。这两者有什么区别呢?其次,网上也有说链接地址和存储地址,那么这四个地址之间有什么区别? 1、运行地址链接地址:他们两个是等价的,只是两种不同的...
  • u013426958
  • u013426958
  • 2015年05月28日 17:43
  • 436

重新分析: 加载地址 存储地址 链接地址 运行地址

重新分析: 加载地址  存储地址  链接地址  运行地址  首先来说:我这几天,天天刷博客,去研究这个问题,其实讲透了也没什么。 1,运行地址链接地址:他们两个是等价的,只是两种不...
  • u013372900
  • u013372900
  • 2017年01月09日 18:36
  • 321

编译地址与运行地址

(1)什么是编译地址   32位的处理器,它的每一条指令是4个字节,以4个字节存储顺序,进行顺序执行,CPU是顺序执行的,只要没发生什么跳转,它会顺序进行执行行, 编译器会对每一条指令分配一个编译地...
  • silent123go
  • silent123go
  • 2016年11月12日 13:30
  • 1018

加载地址与运行地址

要是做过uboot开发,就是会遇到过运行地址与加载地址的概念,确实比较抽象与模糊,网上很多解释都是说运行地址就是加载地址,还有就是他们有很大的关系。其实他们根本一点关系都没有,但是很巧合他们很多时候都...
  • yangyiwei524386
  • yangyiwei524386
  • 2012年04月01日 16:07
  • 4167

ARM裸机编程 (汇编运行地址,链接地址,加载地址,存储地址 位置无关码、位置有关码)

搞ARM开发时,在连接目标代码会提到运行地址和加载地址。这两者有什么区别呢?其次,网上也有说链接地址和存储地址,那么这四个地址之间有什么区别? 1、运行地址链接地址:他们两个是等价的,只是两种不同...
  • u012590688
  • u012590688
  • 2015年05月19日 09:18
  • 815

怎么修改kernel的加载地址和运行地址

编译U-boot时候会在U-boot/tools/生成一个mkimage的制作工具,用来生成uImage,把mkimage放在/usr/bin目录下这样 make uImage的时候就可以自动生成uI...
  • qq_21792169
  • qq_21792169
  • 2015年12月03日 22:07
  • 13659

嵌入式Linux学习:浅淡加载地址和运行地址区别&汇编指令ldr和adr的区别

笔者简单的分享了在学习uboot过程中的一些心得,如果有问题,欢迎及时提出;...
  • u012176730
  • u012176730
  • 2016年12月30日 12:21
  • 445
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:代码的加载地址与运行地址
举报原因:
原因补充:

(最多只允许输入30个字)