设为首页
收藏本站
用户名
Email
自动登录
找回密码
密码
登录
注册
快捷导航
平台
Portal
论坛
BBS
文库
项目
群组
Group
我的博客
Space
搜索
搜索
热搜:
shell
linux
mysql
本版
用户
LinuxSir.cn,穿越时空的Linuxsir!
»
论坛
›
功能型操作系统 —— LinuxSir.cn
›
Linux小型、嵌入式系统
›
ARMboot的cpu/arm720t/start.S的重定位问题
返回列表
查看:
1645
|
回复:
6
ARMboot的cpu/arm720t/start.S的重定位问题
[复制链接]
jetking
jetking
当前离线
积分
561
IP卡
狗仔卡
发表于 2006-4-10 21:39:49
|
显示全部楼层
|
阅读模式
armboot的cpu/arm720t/start.S里有重定位的一段代码
大致意思就是一个copy_loop,把映像从flash拷贝到了ram,这个没有错。
然后就调用c的入口程序,之后认为armboot运行于ram,而非flash,如下所示:
ldr pc, _start_armboot
_start_armboot: word start_armboot /*start_armboot()定义在Board.c中。*/
复制代码
我的问题是,ldr pc ,_start_armboot之前所有的代码都是在flash里执行的,那么此句也不例外,为什么ldr pc,_start_armboot后,跳转到ram中的start_armboot()而非flash中原有的start_armboot()?
说的有点罗嗦,希望大家都能明白我的意思,也希望大家能帮我解答,谢谢
回复
使用道具
举报
提升卡
置顶卡
沉默卡
喧嚣卡
变色卡
显身卡
DoDo
DoDo
当前离线
积分
1538
IP卡
狗仔卡
发表于 2006-4-10 22:43:00
|
显示全部楼层
和内存映射有关系吧
回复
支持
反对
使用道具
举报
显身卡
jetking
jetking
当前离线
积分
561
IP卡
狗仔卡
楼主
|
发表于 2006-4-11 15:46:50
|
显示全部楼层
楼上是指remap吧?
remap之后倒是有可能在ram里执行了,因为ram被映射到了0x0开始的地方,而且又有先前拷贝来的代码段和数据段。
没找到有remap的代码阿,而且每种cpu的remap寄存器是不一样的,设置也是不尽相同...
再说,就算remap,也应该在ldr pc,_start_armboot之前执行,否则还是在flash里跑。
回复
支持
反对
使用道具
举报
显身卡
DoDo
DoDo
当前离线
积分
1538
IP卡
狗仔卡
发表于 2006-4-11 19:45:55
|
显示全部楼层
我所说的是硬件层次的映射.
在 skyeye 中虚拟的时候, 要在配置文件中进行这样的设备映射, 所以我猜测即使没有经过 remap, 内存本身已经被映射为不同的设备了
当然啦, 凭我仅有的微机原理知识, 这种猜测正确的可能性微乎其微. 因为嵌入式版人气不旺, 所以才斗胆猜测的, hehe
回复
支持
反对
使用道具
举报
显身卡
jetking
jetking
当前离线
积分
561
IP卡
狗仔卡
楼主
|
发表于 2006-4-11 20:35:20
|
显示全部楼层
我说的remap就是硬件层次上的重映射
设置cpu的相关寄存器之后,本来flash从0x0开始映射为ram从0x0开始,我做过4510和2510都有类似的功能,44b0就没有了。
skyeye.conf中已经是remap过的存储器配置
但是armboot并不是for skyeye的。
人气不旺阿~~~
回复
支持
反对
使用道具
举报
显身卡
LYOO
LYOO
当前离线
积分
782
IP卡
狗仔卡
发表于 2006-4-20 17:16:43
|
显示全部楼层
不错,从表面上来看这句_start_armboot: word start_armboot
_start_armboot所代表的地址应该是它在镜像文件中的地址,也就是ROM中的地址,
但在没有操作系统的环境下编程,源码编译完后,在链接阶段,要手工对其“定址”,所以,查看一下链接脚本(定址脚本)就会发现,start_armboot()的地址是经过“定址的”,也就是说它的地址实际上是从一个手工规定的一个内存基地址偏移得到的。
通常在操作系统环境下编程,定址脚本是由操作系统替我们安排好的,以为对大多数人来说是不会感觉到它的存在的。
回复
支持
反对
使用道具
举报
显身卡
lirm
lirm
当前离线
积分
1
IP卡
狗仔卡
发表于 2006-10-18 22:03:54
|
显示全部楼层
我同样有楼主的困惑,上面的高手的解释:
“所以,查看一下链接脚本(定址脚本)就会发现,start_armboot()的地址是经过“定址的”,也就是说它的地址实际上是从一个手工规定的一个内存基地址偏移得到的。”
能不能说得更详细些,到底start_armboot的地址是在哪里的赋值的,你说的链接脚本是
armboot.lds文件么?但里面我找不到啊,还是不懂,请执教,谢谢!!!
回复
支持
反对
使用道具
举报
显身卡
返回列表
高级模式
B
Color
Image
Link
Quote
Code
Smilies
您需要登录后才可以回帖
登录
|
注册
本版积分规则
发表回复
回帖后跳转到最后一页
浏览过的版块
BSD 讨论专题
Archlinux讨论区
红旗 REDFLAG Linux
Ubuntu Linux 专题讨论
Gentoo Linux
SuSE Linux
硬件设备 Linux 驱动
Linux 基础讨论区(新手速成)
Mandriva Linux
Copyright © 2002-2023
LinuxSir.cn
(http://www.linuxsir.cn/) 版权所有 All Rights Reserved.
Powered by
RedflagLinux!
技术支持:
中科红旗
|
京ICP备19024520号
快速回复
返回顶部
返回列表