LinuxSir.cn,穿越时空的Linuxsir!

 找回密码
 注册
搜索
热搜: shell linux mysql
查看: 1645|回复: 6

ARMboot的cpu/arm720t/start.S的重定位问题

[复制链接]
发表于 2006-4-10 21:39:49 | 显示全部楼层 |阅读模式
armboot的cpu/arm720t/start.S里有重定位的一段代码
大致意思就是一个copy_loop,把映像从flash拷贝到了ram,这个没有错。
然后就调用c的入口程序,之后认为armboot运行于ram,而非flash,如下所示:

  1. ldr pc, _start_armboot
  2. _start_armboot:    word start_armboot   /*start_armboot()定义在Board.c中。*/
复制代码


我的问题是,ldr pc ,_start_armboot之前所有的代码都是在flash里执行的,那么此句也不例外,为什么ldr pc,_start_armboot后,跳转到ram中的start_armboot()而非flash中原有的start_armboot()?

说的有点罗嗦,希望大家都能明白我的意思,也希望大家能帮我解答,谢谢
发表于 2006-4-10 22:43:00 | 显示全部楼层
和内存映射有关系吧
回复 支持 反对

使用道具 举报

 楼主| 发表于 2006-4-11 15:46:50 | 显示全部楼层
楼上是指remap吧?
remap之后倒是有可能在ram里执行了,因为ram被映射到了0x0开始的地方,而且又有先前拷贝来的代码段和数据段。

没找到有remap的代码阿,而且每种cpu的remap寄存器是不一样的,设置也是不尽相同...

再说,就算remap,也应该在ldr pc,_start_armboot之前执行,否则还是在flash里跑。
回复 支持 反对

使用道具 举报

发表于 2006-4-11 19:45:55 | 显示全部楼层
我所说的是硬件层次的映射.

在 skyeye 中虚拟的时候, 要在配置文件中进行这样的设备映射, 所以我猜测即使没有经过 remap, 内存本身已经被映射为不同的设备了

当然啦, 凭我仅有的微机原理知识, 这种猜测正确的可能性微乎其微. 因为嵌入式版人气不旺, 所以才斗胆猜测的, hehe
回复 支持 反对

使用道具 举报

 楼主| 发表于 2006-4-11 20:35:20 | 显示全部楼层
我说的remap就是硬件层次上的重映射
设置cpu的相关寄存器之后,本来flash从0x0开始映射为ram从0x0开始,我做过4510和2510都有类似的功能,44b0就没有了。
skyeye.conf中已经是remap过的存储器配置

但是armboot并不是for skyeye的。

人气不旺阿~~~
回复 支持 反对

使用道具 举报

发表于 2006-4-20 17:16:43 | 显示全部楼层
不错,从表面上来看这句_start_armboot:    word start_armboot
_start_armboot所代表的地址应该是它在镜像文件中的地址,也就是ROM中的地址,
但在没有操作系统的环境下编程,源码编译完后,在链接阶段,要手工对其“定址”,所以,查看一下链接脚本(定址脚本)就会发现,start_armboot()的地址是经过“定址的”,也就是说它的地址实际上是从一个手工规定的一个内存基地址偏移得到的。

通常在操作系统环境下编程,定址脚本是由操作系统替我们安排好的,以为对大多数人来说是不会感觉到它的存在的。
回复 支持 反对

使用道具 举报

发表于 2006-10-18 22:03:54 | 显示全部楼层
我同样有楼主的困惑,上面的高手的解释:
“所以,查看一下链接脚本(定址脚本)就会发现,start_armboot()的地址是经过“定址的”,也就是说它的地址实际上是从一个手工规定的一个内存基地址偏移得到的。”
能不能说得更详细些,到底start_armboot的地址是在哪里的赋值的,你说的链接脚本是
armboot.lds文件么?但里面我找不到啊,还是不懂,请执教,谢谢!!!
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

快速回复 返回顶部 返回列表