前言
以下所写的内容都是基于韦东山JZ2440开发板的,更多内容可参考韦东山第一期ARM裸机视频代码重定位章节或韦东山S3c2440代码重定位详解学习。
一、什么是代码重定位?
代码重定位就是将代码的text段、rodata段、data段等从一个地址搬移到另外一个地址。本来程序烧写好之后是在某一个地址开始运行的,经过代码重定位之后,可以在另外一个地址运行。例如:程序烧写在Nor Flash上,本来是在Nor Flash上的0地址开始运行的,通过代码重定位,把数据段或整个程序搬移到SDRAM的0x30000000地址运行。
二、为什么要代码重定位?
1、程序烧写在Nand Flash上的情况
(1)Nand Flash程序的启动流程:当我程序烧写在Nand Flash的时候,CPU是无法从Nand Flash中取代码执行的,开机上电的时候Nand启动硬件会自动把Nand Flash前4K复制到CPU的内部SRAM里面,然后CPU从内部SRAM的0地址开心执行代码。
(2)存在问题:如果当我们的程序大于4K的时候,内部SRAM就不够存放Nand Flash的程序了,因为SRAM的大小只有4K。
(3)解决程序大于4K的方法:在程序设计时,设计程序的前4K代码实现将整个程序读出来放到外部的SDRAM。
![](https://i-blog.csdnimg.cn/blog_migrate/d02f3174486aafc063254db9d76f9067.png)
2、程序烧写在Nor Flash上的情况
(1)Nor Flash程序的启动流程:Nor Flash的基地址为0,片内RAM地址为0x4000 0000;CPU读出N