免费注册 查看新帖 |

Chinaunix

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

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

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2012-10-14 14:14 |只看该作者 |倒序浏览
这几天偶然想到一个问题,一直想不通,所以在这里发帖请教各位大牛们,在使用bootloader时,我们常常需要和这3个地址打交道:编译地址、运行地址和下载地址,这里以U-boot为例子,使用的开发板是S3C2440,编译地址是指各个具体开发板中board/开发板名/config.mk中指定,s3c2440是TEXT_BASE = 0x33F80000
这样我们生成的uboot.bin文件中所有的函数地址就是在TEXT_BASE上做偏移,打开编译好的根目录下文件System.map,显示如下:
  1. 33f80000 T _start
  2. 33f80020 t _undefined_instruction
  3. 33f80024 t _software_interrupt
  4. 33f80028 t _prefetch_abort
  5. 33f8002c t _data_abort
  6. 33f80030 t _not_used
  7. 33f80034 t _irq
  8. 33f80038 t _fiq
  9. 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那么则说明函数调用是以相对地址方式的,如果是相对方式,编译地址和下载地址可以不一致,但实际验证是不行的,这样矛盾产生了。
那位老兄帮忙解答一下????????????????????????????????????????????????????????????????????????
不胜感激!

论坛徽章:
0
2 [报告]
发表于 2012-11-18 16:01 |只看该作者
试着回答下:
如果想从flash运行,地址应该就是0x0, 这个时候不用开启地址remap.
如果bootloader在flash中,有想从0x33xxxx运行,应该开启remap功能.

remap和MMU应该是两个独立的电路.

论坛徽章:
0
3 [报告]
发表于 2012-11-18 16:33 |只看该作者
知不知道bootload里有代码搬运这回事?

论坛徽章:
0
4 [报告]
发表于 2012-12-08 22:47 |只看该作者
本帖最后由 heyangya 于 2012-12-08 22:49 编辑

UBOOT对NOR FLASH和NAND FLASH分别进行了不同的处理,可以看下汇编那块的代码。

论坛徽章:
0
5 [报告]
发表于 2013-02-24 00:32 |只看该作者
回复 3# HDU_rock

很久没上了,我禁止了代码搬移啊,#define CONFIG_SKIP_RELOCATE_UBOOT  1    从NOR Flash到SDRAM的代码搬移就不会做了,我想测试的是我的代码编译地址是0x33f8000,不做代码搬移能否在NOR Flash上执行,其实就是测试,编译地址和运行地址不同能否执行,我已经知道答案了,答案是不能
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP