返回信息流读过uboot代码的应该都记得下面两行代码:
ldr pc, _start_armboot
_start_armboot: .word start_armboot
通过这两行代码进入到第二阶段的C语言代码。
我不明白的地方是在这之前已经将uboot的代码段从flash移到了内存TEXT_BASE处,那start_armboot的值是什么时候怎么确定的以至于能在移动了代码后还能够得到正确的地址?装载重定向表应该不适用这种情况吧?
这是一条镜像帖。来源:北邮人论坛 / embedded-system / #11138同步于 2011/9/16
该镜像源已超过 30 天没有更新,可能在源站已被删除。
Embedded_System机器人发帖
关于uboot中两行代码的疑问,版上有没有人能指导一下!
zhb007
2011/9/16镜像同步8 回复
订阅后,新回复会通过你的通知中心匿名送达。
8 条回复
start_armboot是一个c函数,具体的定义如arm的就在u-boot-2010.09/arch/arm/lib/board.c里面
void start_armboot (void);
ldr pc, _start_armboot //这一行是把start_armboot函数的地址放到pc寄存器
_start_armboot: .word start_armboot //这行是在汇编里面显示的声明一个地址,也就是start_armboot的地址,应该是编译器会自动把这些编程实际的地址
两行的实际作用就是汇编调用c函数,而且进去后永远不返回,如下
void start_armboot (void)
{
//....
/* main_loop() can return to retry autoboot, if so just run it again. */
for (;;) {
main_loop ();
}
/* NOTREACHED - no way out of command loop except booting */
}
呼唤uboot大牛hobby
【 在 zengeronline (zenger) 的大作中提到: 】
: start_armboot是一个c函数,具体的定义如arm的就在u-boot-2010.09/arch/arm/lib/board.c里面
: void start_armboot (void);
: ldr pc, _start_armboot //这一行是把start_armboot函数的地址放到pc寄存器
: ...................
【 在 hobby 的大作中提到: 】
: 来鸟,无助旁观
: 不做uboot好多年呀~
: 【 在 ArmStrong 的大作中提到: 】
: ...................
赶来膜拜师兄,现在看到的代码里各种“edit by hobby”啊
【 在 hobby 的大作中提到: 】
: 你看的是啥代码?是实验室的?
: 【 在 liangwode 的大作中提到: 】
: : 赶来膜拜师兄,现在看到的代码里各种“edit by hobby”啊
: ...................
嗯,嘿嘿,交换芯片,EPON各种
makefile中指定了link时程序段的链接地址, .word start_armboot 的值就是link时为void start_armboot (void) 这个函数分配的地址
ldr pc, _start_armboot 就跳到这个绝对地址去了 (_start_armboot是一个绝对地址,不是相对PC值的偏移量)
如果你没有把程序拷到TEXT_BASE开头的地方,这条指令执行之后,你的程序差不多就挂了
基本上你可以这样理解,假如你是2440的芯片的话
在这条指令之前,你的PC值是0到4K
这条指令执行这后,你的PC值是 TEXT_BASE到 TEXT_BASE+程序段的长度
因此,你必须在拷贝程序到TEXT_BASE之后,才能执行这条指令