readkernel
发表于 2009-12-16 09:31
或者可以用一个更简单的方法
在.lds文件里把.data段的运行地址定义在ram的物理地址空间中,加载地址还是跟在.text后面
操作系统下普通的二进制文件在加载运行时,加载程序 会根据 链接定义 自动把.data段加载到它的运行地址上。
但你这段并不是由操作系统加载的,而是CPU上电启动引导的,所以.text段中的程序开头部分必须做.data段加载操作,把.data段copy到它的运行地址上,后面读写全局变量都是在ram中了。
google里搜 链接脚本文件定义
:mrgreen:
rw99yy
发表于 2009-12-16 09:57
楼主可以将链接地址改成ram地址,relocate之前的代码应该用与地址无关的代码.
你现在的链接地址是多少那?
u-boot在relocate之前没有对全局基本没有对全局变量作修改,都是relocate后作的修改吧.
[ 本帖最后由 rw99yy 于 2009-12-16 10:17 编辑 ]
bitliu1983
发表于 2010-01-19 14:06
ok,谢谢各位大大,前段时间没来得及上论坛。
已经解决了,把链接地址改为拷贝到ram的目的物理地址,我们通通改为0x0,使得代码段和数据段都从0x0开始,然后boot后把bin从flash拷贝到内存的0x0处,就不需要重定位了,内存地址在引导阶段和后面地址都是0x0起始。
pppStar
发表于 2010-01-26 12:27
跟21楼说的很相似!
MARK