|
我使用的2410的板子,使用的是ppcboot做bootloader。最近在研究ppcboot 的启动代码,有很多问题搞不清楚,请教各位大侠:
(1)在最终连接生成ppcboot的时候,使用的ld命令大致如下:
(LD) -Bstatic -Ttext 33f00000 ....(省略)... -o ppcboot
我想这些参数的含义应该是:采用静态编译,即连接静态函数库;当程序执行的时候的入口地址在33f00000处,即将程序的代码段和其他一些数据段拷贝到内存中的33f00000处,具体数据段的顺序由ld script控制。
不知道我这样理解对不对?
(2)在这之后,就会使用(OBJCOPY)命令,我认为该命令的功能为生成一个映像文件,该映像文件的内容为当程序真正执行的时候从内存33f00000处开始的一段程序运行所使用的内存区域二进制代码的拷贝。不知道这样理解对不对?
(3)如果以上理解对的话,我就有以下疑问:ppcboot开始启动是从文件/cpu/920t/start.S,在这个文件中总共调用了两个在外部定义的函数memsetup(/board/smdk2410/memsetup.S)和start_arm (/lib_arm/board.c),我的疑问是:当在start.S中调用这两个函数的时候,是相对于当前位置的偏移吗?还是该函数的加载时地址?
如果是使用的加载是地址的话,那么因为ppcboot的映像文件是被拷贝到2410的flash的00000000地址处,这样的话在程序在开发板上执行的时候就回找不到函数了啊???所以应该的对当前位置的偏移吧???
(4)如果是对当前位置的偏移的话,那么又有疑问了。因为在start.S中有这样一段代码:
relocate:
/*
* relocate armboot to RAM
*/
adr r0, _start /* r0 <- current position of code */
ldr r2, _armboot_start
ldr r3, _armboot_end
sub r2, r3, r2 /* r2 <- size of armboot */
ldr r1, _TEXT_BASE /* r1 <- destination address */
add r2, r0, r2 /* r2 <- source end address */
/*
* r0 = source address
* r1 = target address
* r2 = source end address
*/
copy_loop:
ldmia r0!, {r3-r10}
stmia r1!, {r3-r10}
cmp r0, r2
ble copy_loop
这段代码意思似乎是将存放在00000000处flash中的代码拷贝到内存的33f00000中。这样做的话有什么用啊。程序中所有的函数调用都是相对与当前位置的偏移,怎么也执行不到内存中去啊,难不成在哪一步执行的时候了来了个大跳转,似乎不大可行啊????
小弟看代码已经看了半个多月了,实在是高不明白了。还望各位高手能够多多指点啊,小弟在这里谢谢了先!
还有,哪位大侠能够介绍点分析ppcboot代码的资料啊?
谢谢谢谢谢谢谢谢谢谢谢谢谢.................................. |
|