mr_raptor的专栏

专注移动互联网,连续创业中,著有《深入浅出嵌入式底层软件开发》北航出版社...

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

下面内容是技术讨论群里的读者的提问:
问:
程序下载到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代码了
你自己去调查一下吧
阅读更多
版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/mr_raptor/article/details/7390597
个人分类: ARM体系结构
上一篇C++ 虚函数表解析
下一篇Git 历险记(三)——创建一个自己的本地仓库
想对作者说点什么? 我来说一句

没有更多推荐了,返回首页

关闭
关闭