免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 1476 | 回复: 0
打印 上一主题 下一主题

[BootLoader] 关于bootloader中的编译地址、运行地址和下载地址的问题 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2012-10-14 14:19 |只看该作者 |倒序浏览
这几天偶然想到一个问题,一直想不通,所以在这里发帖请教各位大牛们,在使用bootloader时,我们常常需要和这3个地址打交道:编译地址、运行地址和下载地址,这里以U-boot为例子,使用的开发板是S3C2440,编译地址是指各个具体开发板中board/开发板名/config.mk中指定,s3c2440是TEXT_BASE = 0x33F80000,
这样我们生成的uboot.bin文件中所有的函数地址就是在TEXT_BASE上做偏移,打开编译好的根目录下文件System.map,显示如下:
01.33f80000 T _start

02.33f80020 t _undefined_instruction

03.33f80024 t _software_interrupt

04.33f80028 t _prefetch_abort

05.33f8002c t _data_abort

06.33f80030 t _not_used

07.33f80034 t _irq

08.33f80038 t _fiq

09.33f80040 t _TEXT_BASE

10.33f80044 T _armboot_start

11.33f80048 T _bss_start

12.33f8004c T _bss_end

13.33f80050 t start_code

14.33f80104 t nandflash_boot

15.33f80140 t bad_nand_read

16......
复制代码我的理解是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_UBOOT  1,再设置从norflash启动即可,此时U-boot能否运行,因为开发板送人了,以前测试时我记得是可以运行的,请哪位有开发板的朋友帮忙验证一下,如果能运行,而norflash的地址从0开始,执行函数调用时又去调用33fXXXXX处的函数,那程序不是应该crash掉吗?如果不crash那么则说明函数调用是以相对地址方式的,如果是相对方式,编译地址和下载地址可以不一致,但实际验证是不行的,这样矛盾产生了。
那位老兄帮忙解答一下????????????????????????????????????????????????????????????????????????
不胜感激!


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

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP