韦东山嵌入式Linux学习笔记之——代码重定位001_段的概念_重定位的引入

2019-07-12 19:26发布

在2440中,cpu的命令可以通过内存控制器直接到达SRAM、SDRAM、NOR flash中,因此可以将代码直接放在上述三种内存单元中直接运行,相应地就可以设置为SRAM、SDRAM或者NOR flash 启动机制。但是在实际应用中我们也可以设置nand flash启动,这是为什么呢?原因是这里用到了代码重定位的机制。(1)nand flash 启动:
 随之而来的有一个问题,就是如果程序>4K怎么办呢?在前4K的代码中,需要完成将后续程序拷贝至SDRAM的工作。
(2)nor flash启动:使用nor启动时,cpu看到的0地址时nor flash中的0地址。此时片内内存SRAM的基地址为:0x40000000而在采用nand flash启动时,片内内存SRAM的基地址为:0
nor flash的特点:
nor flash就像电脑的硬盘,里面通常保存了一些程序代码等比较重要的内容,因此不能够通过常用指令对其进行写操作。如果要写nor flash, 则需要一些特殊的指令。
这里的例子是全局/静态变量。它们在bin文件中,写在nor flash上,如果程序中直接对其进行修改,则无效。因此需要将其重定位,放到SDRAM中,然后进行修改操作,最后重新写入nor flash中。现在根据之前的SDRAM的程序验证刚刚的理论:在原函数中定义全局变量g_char,之后在主程序中对其进行加值操作,最后将程序分别下载值开发板的nor flash和nand flash中观察程序运行的现象来验证nor和nand flash的特性。#include "s3c2440_soc.h" #include "uart.h" #include "init.h" char g_char = 'A' int main(void) { uart0_init(); while(1) { putchar(g_char); g_char++; /* nor启动时,此代码无效 */ delay(100000); } return 0; }编译整个程序后发现生成的.bin文件有30+K,显然不合理,打开汇编文件后查看到程序的数据段存放在0x00008474(33.9K)的内存空间中,这显然是不合理的。
下面需要修改Makefile:

重新make编译后结果为:
可以看到这时候.bin文件的大小变为了2049字节。之后将.bin文件分别烧写进开发板的nor 和nand flash中运行:前面全是A的是用了nor启动的效果,后面的字母递增的是采用了nand启动的效果
打开反汇编分析:
这里的strb是存储器写入指令,其中[r2]的地址在nor flash上,nor的特性就是只读不写,因此这里的存储指令没法执行,故一直显示A。给代码加入一些变量:char g_char = 'A'; const char g_char2 = 'B'; int g_A = 0; int g_B;重新编译后查看反汇编内容。
值得注意的是,这里的comment段存放的是一些表示系统信息的字符串,如这里的00474343表示:
总结:一个程序所包含的内容: