韦东山Linux嵌入式课程社区
直播中

刘嵩

7年用户 126经验值
私信 关注

如何计算C入口点相对于uboot起始的偏移?

关于u-boot的代码重定位疑惑,这个疑惑存在好久,而且查了好多资料,都有不同的解读,希望有关大神解惑
1、第一阶段代码在RAM的4K空间,把nandflash的bootloader代码复制到SDRAM的过程中,是只复制第二阶段的还是整个uboot?
在第一课的毕业班代码中,从nandflash中复制代码的起始地址是0,难道不是整个uboot吗?书中为什么说是复制第二阶段的代码?
2、跳转
是跳转到第二阶段C入口点 还是  链接地址uboot的起始地址处

3、如果是跳转到C入口点,如何计算C入口点相对于uboot起始的偏移?

希望知道问题的大神解惑,谢谢!!1

回帖(3)

蓝静

2019-9-20 10:04:32
复制的是整个uboot这句话理解应该是对的
2440设为nand启动的时候,片内有4k的ram(从0地址开始),外面接有64M的sdram(地址从0x30000000),裸板程序烧在nand flash上面,一上电nand 的内容会自动复制到4kram那里,然后从0地址开始运行。如果程序超过4k(比如u-boot)(或者不想程序在ram上运行),那么就把nand的内容复制到sdram,sdram有64m,应该复制到那里呢


答:复制到链接地址(就是程序运行后它应该位于的地方)



问:一开始地址为0,为什么能执行



答:因为这段代码是用位置无关码写的



位置无关码:CPU取址时,总是相对于本条执行指令的相对地址去取指。比如执行一个ADD指令时,PC要取下一指令的地址,就在原来的基础上+4。这就不管你代码放在存储器的任何位置,只要他们的相对地址没有改变,就能正常执行程序。一般上电复位那几条语句就必须是位置无关码指令。
举报

秦伙茂

2019-9-20 10:23:47
我也想过这个问题。 我的理解是,复制的是整个uboot,比如uboot有5步,第一步是复制,然后5步都被拷贝到SDRAM中,之后从SDRAM中的第二部开始执行。 这里应该把握的就是程序的链接地址的概念。
举报

王辉

2019-9-20 10:38:50
我想通了,
复制的是整个uboot
跳转的时候跳转到start_armboot,用的是ldr pc , start_armboot,而start_armboot在链接的时候有个绝对地址,该地址大于33f80000,跳转过去就是第二阶段的代码,不知道理解的对不对
举报

更多回帖

发帖
×
20
完善资料,
赚取积分