程序的三段的解释
一个程序主要包括下面三个段:代码段,数据段,BSS段
代码段:指令代码(局部变量也放在代码段)。
数据段:有初始值(并且不为0)的全局变量或静态变量。
BSS段:初始化为0或无初始值的全局或静态变量。
在我们编译出来的二进制文件中,是不存在BSS段的。在我们程序运行时,会自动清除BSS段。这样可能节省内存空间。
程序在访问全局变量时,用到的是链接地址。程序所用到的链接地址不一样,会导致程序访问全局量,所用的地址不一样。
在我们的ARM设置从NAND flash启动时,ARM上电启动的时候,硬件会自动将NAND flash的前8K代码拷贝到ARM片内SRAM
的0地址中执行。
这时我们要注意了:如果我们在程序编译的时候设置链接地址为0x50000000时,那程序存放全局变量的地址一定是大于0x50000000
这个地址的,而一开始我们的程序是在片内0地址处运行。程序在访问全局变量时会用链接地址来访问全局变量,这时程序执行就会出
错。为了能让程序正确运行,我们就要重定位我们的程序。
什么是重定位程序呢?
就是把片内8K的程序重新拷贝到链接地址所在的内存中去执行。
位置无关码:就是不管你的链接地址是多少,这些代码也能正常运行。
什么样的代码才是位置无关码:B、BL 且不访问全局变量或静态变量。