u-boot重定位时,如果ro=0, 为什么能实现将nand flash代码搬移到sdram?
1. 以官方u-boot-1.1.6,s3c2440,启动模式为外部nand flash为讨论前提。
按照芯片手册理解,上电启动后pc = 0, nand flash最前面的4KB内容会被加载到stepping stone中,之后开始运行到relocate这里来,
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(1)
3个月竟然没人回答啊,都怪我不经常逛国内的论坛,哈哈!
如果r0 = 0,自然是要搬移flash的代码到ram的!
首先,你得知道adr和ldr的不同。adr是取相对地址,ldr是取绝对地址,书上网上都有说的,什么意思呢?adr r0, _start执行后,r0的值有多种可能,是这么计算的,r0 = pc - (adr语句所在地址 - _start),对于同一份代码而言,括号中的值是固定的,这一点可以理解吧?pc的值在stepping stone中与在ram中是不同的,在stepping stone中,r0的值就是0,也就是硬件上电或硬件重启时的0地址,在ram中呢,则r0的值就是代码搬移到ram的起始地址。ldr r1, _TEXT_BASE执行后,r1的值只有一种可能,那就是_TEXT_BASE的值,这个是代码搬移到ram的起始地址。
所以,adr的目的就是获得代码的运行时地址。u-boot中这段代码就是为了检查代码的加载地址是否正确,如果和_TEXT_BASE一致则表示已经加载到我们想要加载到的地方,也就是我们真正想让代码运行的地方,这就是所谓的加载地址和运行时地址一致。如果加载地址和运行是地址不一致,那么代码就需要做到地址无关,否则会出错,这方面就不再具体说了。