QQ登录

只需一步,快速开始

 找回密码
 注册

QQ登录

只需一步,快速开始

查看: 865|回复: 3

关于ppcboot的几个问题,请教高手!

[复制链接]
发表于 2004-9-6 21:55:45 | 显示全部楼层 |阅读模式
我使用的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代码的资料啊?
          谢谢谢谢谢谢谢谢谢谢谢谢谢..................................
发表于 2004-9-6 22:54:13 | 显示全部楼层
ld,OBJCOPY这些都是tools。。。
3 为汇编嵌套C
回复

使用道具 举报

 楼主| 发表于 2004-9-6 23:17:43 | 显示全部楼层
jackzheng2002兄,感谢你的回复。

ld,OBJCOPY都是工具我知道,具体是使用的armv41工具链

关键是采用静态连接的时候,具体将程序加载到内存当调用函数的时候是通过什么方式调用的。这关系到当将映像文件烧写到flash上后程序还能不能运行。
举个例子,当调用memsetup的时候,如果是使用mov  pc ,33f3333(假定该处为该函数的内存中的实际地址),这样当映像文件烧到板子上后就会找不到该函数了,因为映像是被烧到flash的0000000处的。而如果是使用mov pc ,pc+xxxxx(xxxxx为函数入口相对与当前位置的偏移),这样就可以了在板子上运行的时候找到该函数了,因为偏移没有变。

不知道我明白了没有???
回复

使用道具 举报

 楼主| 发表于 2004-9-6 23:19:09 | 显示全部楼层
jackzheng2002兄,感谢你的回复。

ld,OBJCOPY都是工具我知道,具体是使用的armv41工具链

关键是采用静态连接的时候,具体将程序加载到内存当调用函数的时候是通过什么方式调用的。这关系到当将映像文件烧写到flash上后程序还能不能运行。
举个例子,当调用memsetup的时候,如果是使用mov  pc ,33f3333(假定该处为该函数的内存中的实际地址),这样当映像文件烧到板子上后就会找不到该函数了,因为映像是被烧到flash的0000000处的。而如果是使用mov pc ,pc+xxxxx(xxxxx为函数入口相对与当前位置的偏移),这样就可以了在板子上运行的时候找到该函数了,因为偏移没有变。
(当然,上面的代码在内存中都是以二进制机器指令的形式存在的,这里这样写只是为了清晰)

不知道我明白了没有???
回复

使用道具 举报

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

本版积分规则

GMT+8, 2024-11-23 20:46 , Processed in 0.089044 second(s), 15 queries .

© 2021 Powered by Discuz! X3.5.

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