我有一个用汇编语言编写的裸机ARM的启动代码,我试图了解它的工作原理。二进制文件写在某些外部闪存中,并在启动时将自身的一部分复制到RAM中。即使阅读了wikipedia entry,在这种情况下我仍然没有完全了解重定位的概念。 RAM映射到低地址窗口,而闪存映射到高地址窗口。有人可以向我解释为什么我们在这里测试链接寄存器的值吗?
/* Test if we are running from an address, we are not linked at */
bl check_position
check_position:
mov r0, lr
ldr r1, =check_position
cmp r0, r1 /* ; don't relocate during debug */
beq relocated_entry
最佳答案
我的猜测是应用程序从ram运行,而作者在调试应用程序时可能正在使用某种引导程序和/或jtag将测试应用程序直接加载到ram中,因此没有理由进行复制和运行(这可能导致崩溃)。
您这样做的另一个原因是避免无限循环。例如,如果您要从Flash引导(通常需要启动)但要从ram执行,则最简单的方法是将整个Flash或整个Flash的一部分复制到ram,然后分支到ram的开头。当您执行此操作时,这意味着您再次单击“将应用程序复制到ram和branch”循环,以避免再次发生(这可能会使您崩溃),您有某种感觉是我从Flash运行此循环还是未进行测试。