对位置无关代码的理解

时间:2021-02-28 10:51:09

今天在看uboot编译流程的时候,突然发现对程序的地址相关性的记忆又有点模糊了。搞嵌入式软件就是这个不好,需要学习和掌握很多知识点,才能够对开发中的所有细节都有全面的掌握。可是往往这种掌握又不是很有必要的,因为很多细节性的问题在实际开发过程中,又不一定需要去关注,或者说关注的很少。这就直接导致了学习和掌握了很多细节的知识,往往久了不用,就淡忘了。

 

比如这里提到的代码地址相关性,以前在搞VxWorks,尤其是bootrom存放位置的时候就有过分析。bootrom编译的时候是不用考虑代码运行位置的,但实际上bootrom加载到内存运行和在rom上运行时的地址是不同的。如果bootrom存放在spiflash或者norflash中,因为该类型flash支持XIP,bootrom可以直接运行。但spiflash或者norflash和内存中的地址显然不同。比如spiflash或者norflash中的bootrom从0x80000000开始存放,而内存是从0开始的。存放在spiflash或者norflash上时bootrom中的跳转地址就是以0x80000000为基础,存放在内存时就不需要了。

 

“所以就要求bootrom中有一部分代码是地址无关的,后续存在跳转的地方,跳转地址应该根据距离程序入口的偏移量计算出来,这些工作不是编译器实现的,而是汇编代码编写时的注意事项。”地址相关性的编程方式,VxWorks有很好的诠释,尤其是针对spiflash启动设计的bootrom。它既可以在调试时直接加载到内存执行,也可以产品发布后,固话在flash发布。它的bootrom启动程序地址无关部分代码就很有特点。没能找到VxWorks的BSP代码,关于VxWorks的bootrom代码可以参考文章【http://blog.csdn.net/daniellee_ustb/article/details/8972036】的解读。

 

bootrom运行的时无操作系统环境,对于有操作系统的情况下,这些工作可以由操作系统的加载器代劳。所以,我们编写的PC上的应用程序,都是可以存放在任何位置就能运行的。

 

更多和位置无关代码的介绍可以参考文章:

位置无关代码(PIC)的思考 【http://blog.csdn.net/ustc_dylan/article/details/6965330】

uboot在flash上运行 【http://blog.csdn.net/free2011/article/details/5416903】