转自:http://blog.csdn.net/yangyiwei524386/article/details/7419667


要是做过uboot开发,就是会遇到过运行地址与加载地址的概念,确实比较抽象与模糊,网上很多解释都是说运行地址就是加载地址,还有就是他们有很大的关系。其实他们根本一点关系都没有,但是很巧合他们很多时候都是相同的,加 载地址:就是程序所被加载到RAM的地址,也就是程序在RAM或者norflash的地址,因为程序在硬盘或者nandflash中时不能运行,所以需要 加载到RAM中,这个地址就是加载地址,比如s3c2440在RAM的地址0x30000000,所有加载地址就是0x30000000。运行地址:就是 程序在编译的时候确定的地址,比如你编译时指定地址为0x10000000,那么你程序就会以这个地址为参考,比如说在距离程序的0x100出定义一条函 数fuc(),然后执行A=fuc(),那么这时候就会把0x10000100这个值赋给A。所以就 说加载地址与运行地址完全没有关系,但是为什么很多时候加载地址与运行地址要相同,比如说指定了运行地址为0x30000000,但是加载地址为 0x00000000,要是执行了上面说的fuc()函数,PC指针就跳转0x30000100,但是去了哪里才发现没有代码,那么程序就会出错。要是程 序中没有涉及到地址跳转,和地址取值,或者用的是相对PC值,加载地址和运行定义不相同,程序也可以正常运行。