天嵌 ARM开发社区

 找回密码
 注册
查看: 3653|回复: 5

uboot中start.S的问题

[复制链接]
wangpeihui123 发表于 2011-1-19 08:57:21 | 显示全部楼层 |阅读模式
调试阶段的代码是直接在RAM中运行的,而最后需要把这些代码固化到Flash中,因此U-Boot需要自己从Flash转移到
RAM中运行,这也是重定向的目的所在。通过adr指令得到当前代码的地址信息:如果U-boot是从RAM开始运行,则从adr,r0,_start得到的地址信息r0=_start=_TEXT_BASE=TEXT_BASE=0x33F80000; 如果U-boot从Flash开始运行,即从处理器对应的地址运行,
则r0=0x0000,这时将会执行copy_loop标识的那段代码了。
_TEXT_BASE 定义在board/smdk2410/config.mk中

#ifndef CONFIG_SKIP_RELOCATE_UBOOT
relocate:    /* relocate U-Boot to RAM     */
adr r0, _start  /* r0 <- current position of code   */
ldr r1, _TEXT_BASE  /* test if we run from flash or RAM */
cmp     r0, r1  /* don't reloc during debug         */
beq     stack_setup

这个通过adr指令得到当前代码的地址信息:如果U-boot是从RAM开始运行,则从adr,r0,_start得到的地址信息r0=_start=_TEXT_BASE=TEXT_BASE=0x33F80000; 如果U-boot从Flash开始运行,即从处理器对应的地址运行,则r0=0x0000是为什么啊,,请高手分析指点
embedsky_lhh 发表于 2011-1-19 10:01:32 | 显示全部楼层
这个得结合整个UBoot代码去分析吧?开机或复位后,cpu,是从0x00000000处取得一条指令,然后再恢复RAM状态开始执行。r0=0x0000,我理解就是把UBoot代码从让CPU能找到
回复

使用道具 举报

embedsky_lhh 发表于 2011-1-19 10:01:35 | 显示全部楼层
这个得结合整个UBoot代码去分析吧?开机或复位后,cpu,是从0x00000000处取得一条指令,然后再恢复RAM状态开始执行。r0=0x0000,我理解就是把UBoot代码从让CPU能找到
回复

使用道具 举报

crease 发表于 2011-1-19 16:59:08 | 显示全部楼层
不是这样理解的,adr是基于PC推导标号地址。如果u-boot从地址0开始启动,比如stepping stone或者直接从Nor启动,这样pc的值就在低地址移动,adr基于PC推出_start的值自然为0.这时便需将从0x0开始的代码搬到TEXT_BASE去。

如果其它人已经把u-boot搬到TEXT_BASE了,再把控制权交给u-boot,那么u-boot运行时的PC值便为TEXT_BASE,adr得到_start的值自然也是TEXT_BASE,这就不需要搬动了。
回复

使用道具 举报

 楼主| wangpeihui123 发表于 2011-1-20 08:49:50 | 显示全部楼层
为什么代码要搬到TEXT_BASE这个地址去执行????????????????????
回复

使用道具 举报

xiaoqiang08wang 发表于 2011-3-20 22:28:07 | 显示全部楼层
呵呵,楼上可以给我打电话哈,13678094043,我刚刚搞明白,因为这是连接器做的事情,连接器把绝对地址都确定了,如果你不把代码搬到那个地方,你的PC会到那个地方去找代码哈,呵呵,这是绝对地址的问题
回复

使用道具 举报

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

本版积分规则

关闭

i.MX8系列ARM cortex A53 M4 工控板上一条 /1 下一条

Archiver|手机版|小黑屋|天嵌 嵌入式开发社区 ( 粤ICP备11094220号-2 )

GMT+8, 2025-8-15 22:15 , Processed in 2.039111 second(s), 21 queries .

Powered by Discuz! X3.5 Licensed

© 2001-2024 Discuz! Team.

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