一、为什么需要代码重定位?
因为Flash上的一些读写特性!
例如:S3c2440的CPU可以直接给SDRAM、NOR FLASH发送命令,但是不能给NAND FLASH发送命令,也就是说CPU无法从NAND获取代码然后执行;
若程序拷贝到NADN上启动,则NAND FLASH启动时,会将NAND前4K内存拷贝到SDRAM中,然后从SDRAM的0地址开始执行;
那么如果可执行程序大于4K呢?
那么这4K的代码就要作为引导,将整个程序读出来,放到SDRAM(即代码重新定位);
有的同学可能就会问,NAND不能用,那么我用NOR不就行了嘛,但是同样,NOR的特性是能像内存直接读,但是不能像内存直接写,因此需要把全局变量和静态变量保存在SDRAM中,才能进行修改:
两个方法如下:
第一个方法
把数据段和代码段靠在一起;
烧写在Nor Flash上面;
运行时把数据段的(全局变量)复制到SDRAM,即0x3000000位置(重定位);
第二个方法
让文件直接从0x30000000开始,全局变量在0x3……;
烧写Nor Flash上 0地址处;
运行会把整个代码段数据段(整个程序)从0地址复制到SDRAM的0x30000000(重定位);
其中主要涉及SDRAM.lds 链接脚本的修改;