×
单片机 > 单片机程序设计 > 详情

s3c2440学习笔记——重定位和链接脚本

发布时间:2024-05-21 发布时间:
|

—————————————————————————————————————

今天温习了韦老师有关代码重定位的视频,小结一下所得。

什么是重定位?

通俗地讲,就是将代码复制一份到其他地方。

以我的jz2440为例,假设开发板为nor启动(板载nor flash有2M大小且地址是从0x0000_0000开始),则我所烧录的bin文件会从nor flash的0地址开始执行。nor flash有个特性——不可直接进行写操作,因此如果我的代码里包含了一些全局变量(通常放在data或rodata段),那么我是无法改变它们的。这时候就可以通过重定位来进行操作,即我把这些全局变量复制一份到SDRAM(即内存),那么我可以通过访问内存来进行相关读写操作。


同样地,假设开发板是nand flash启动,则在我吧bin文件烧录到nand flash之后,硬件会自动将前4k代码复制到片内SRAM内存。如果我的代码不超过4k,那么那些全局变量我是可以直接访问到的,但如果我的代码超过了4k,程序显然是无法正常运行的,这时候也需要进行重定位,即我在这前4k的代码中将所有的代码都复制一份到SDRAM中,并跳转到SDRAM中执行程序。


因此,通常你可以选择将部分代码重定位到SDRAM,或者全部代码重定位到SDRAM中,前者节省内存资源,后者的话更常见一些(因为一般烧录软件不支持部分重定位)。


重定位操作有几个注意点:

重定位前要相对跳转,重定位后要绝对跳转。

相对跳转时还是运行在最初烧录的代码,重定位后要转入内存执行就必须绝对跳转。

重定位前不要访问全局变量、静态变量,因为还没有进行重定位,变量还没有放进内存,你如果这时候访问变量得到的是垃圾值。

重定位就是这样。

————————————————————————————————————

链接脚本

链接脚本是个控制连接器工作的规则集合,它规定了连接器链接的顺序、地址等等。

这里有篇博客写得不错,直接参考链接脚本。


这里说明一点,我一开始总把链接脚本和重定位搞在一起,结果概念很模糊,仔细考虑后感觉这俩其实是各自为政,链接脚本用来指挥连接器怎么把各个.o文件的各个段进行链接、各个代码应该的加载地址和运行地址应该是怎样的、每个段的对齐方式,然后就能搭出来一个bin文件;重定位会用到链接脚本的一些内容,比如通常使用链接脚本中的标记来指代地址,通常链接脚本中的运行地址和加载地址不同时才会需要重定位,如果没哟重定位中的复制操作,链接脚本中的地址规则就不会得到执行。


『本文转载自网络,版权归原作者所有,如有侵权请联系删除』

热门文章 更多
单片机制作超级流水灯