|  | 
 
| 我使用的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代码的资料啊?
 谢谢谢谢谢谢谢谢谢谢谢谢谢..................................
 | 
 |