关于bootloader中的编译地址、运行地址和下载地址的问题
这几天偶然想到一个问题,一直想不通,所以在这里发帖请教各位大牛们,在使用bootloader时,我们常常需要和这3个地址打交道:编译地址、运行地址和下载地址,这里以U-boot为例子,使用的开发板是S3C2440,编译地址是指各个具体开发板中board/开发板名/config.mk中指定,s3c2440是TEXT_BASE = 0x33F80000,这样我们生成的uboot.bin文件中所有的函数地址就是在TEXT_BASE上做偏移,打开编译好的根目录下文件System.map,显示如下:33f80000 T _start
33f80020 t _undefined_instruction
33f80024 t _software_interrupt
33f80028 t _prefetch_abort
33f8002c t _data_abort
33f80030 t _not_used
33f80034 t _irq
33f80038 t _fiq
33f80040 t _TEXT_BASE
33f80044 T _armboot_start
33f80048 T _bss_start
33f8004c T _bss_end
33f80050 t start_code
33f80104 t nandflash_boot
33f80140 t bad_nand_read
.....我的理解是Uboot中在C部分的函数调用都是以绝对地址来进行的,因为uboot关闭了MMU,没有提供虚拟地址,所有的函数调用是以绝对地址来执行,调用那个函数就到上表中对应的地址中去寻找(start.S中除外,那里的函数调用是以b和bl调用,那是一种相对地址调用),我所说的是C语言的部分,所以在实际中,编译地址和下载地址需要一致,这样C语言中的调用才能找到对应的函数(因为函数调用是以绝对地址方式调用)。
这种理解方式解释了为什么uboot的编译地址和下载地址须一致的问题,你可以做实验,编一个可在SDRAM中直接运行的U-boot,但是下载地址和编译地址不一致,其结果就是程序飞了。
但是另一种情况出现了,norflash是支持XIP的, uboot也可以支持在norflash中直接运行,你可在对应开发板的.h中添加宏
#define CONFIG_SKIP_LOWLEVEL_INIT 1
#define CONFIG_SKIP_RELOCATE_UBOOT1,再设置从norflash启动即可,此时U-boot能否运行,因为开发板送人了,以前测试时我记得是可以运行的,请哪位有开发板的朋友帮忙验证一下,如果能运行,而norflash的地址从0开始,执行函数调用时又去调用33fXXXXX处的函数,那程序不是应该crash掉吗?如果不crash那么则说明函数调用是以相对地址方式的,如果是相对方式,编译地址和下载地址可以不一致,但实际验证是不行的,这样矛盾产生了。
那位老兄帮忙解答一下????????????????????????????????????????????????????????????????????????
不胜感激! 试着回答下:
如果想从flash运行,地址应该就是0x0, 这个时候不用开启地址remap.
如果bootloader在flash中,有想从0x33xxxx运行,应该开启remap功能.
remap和MMU应该是两个独立的电路. 知不知道bootload里有代码搬运这回事? 本帖最后由 heyangya 于 2012-12-08 22:49 编辑
UBOOT对NOR FLASH和NAND FLASH分别进行了不同的处理,可以看下汇编那块的代码。 回复 3# HDU_rock
很久没上了,我禁止了代码搬移啊,#define CONFIG_SKIP_RELOCATE_UBOOT1 从NOR Flash到SDRAM的代码搬移就不会做了,我想测试的是我的代码编译地址是0x33f8000,不做代码搬移能否在NOR Flash上执行,其实就是测试,编译地址和运行地址不同能否执行,我已经知道答案了,答案是不能
页:
[1]