ARM scatter文件以及boot的一点收获
- 格式:doc
- 大小:25.50 KB
- 文档页数:2
ARM scatter文件以及boot的一点收获
armlink可以通过scatter文件指定Load view和Execute View。
那么往往我们指定的时候并不会把某个区放在一起,比如ZI,我通过试验发现,如果你把ZI指定到了某一区域(Execute View -Region Name),那么他就不成为真正意义上的ZI了,ZI是不占bin文件的空间的。
ZI是有bootloader去初始化的。
我们知道,在PC上一般进程执行时,前面的虚拟内存上是:text,data,bss,然后最后面是stack,而stack是可以指定大小的。
也就是说bss->ZI是在一起的,os的loader会帮助你把ZI全部清零。
所以我在第一段文字那么讲,因为scatter文件有可能会把ZI固定放在某个地方,所以就不可能把所有的ZI放在一起了。
那么boot是如何知道通用ZI等区域的起始地址和长度呢?请看某个.s里面的IMPORT:
IMPORT config_bridge_wait_states
IMPORT |Image$$NAND_SDRAM_COPY$$Base|
IMPORT |Image$$NAND_SDRAM_COPY$$Length|
IMPORT |Load$$NAND_SDRAM_COPY$$Base|
IMPORT |Image$$BB_DATA$$Base|
IMPORT |Image$$BB_DATA$$Length|
IMPORT |Load$$BB_DATA$$Base|
IMPORT |Image$$BB_DATA$$ZI$$Base|
IMPORT |Image$$BB_DATA$$ZI$$Length|
但是你会奇怪,这些变量那里来的啊?肯定是armlink自动生成的,那我就奇怪了,为啥叫
BB_DATA
呢?诡异了。
我查了ADS的Linker guide,Accessing Image Symbols这一节里面说:
Symbol Description
Load$$region_name$$Base Load address of the region.
Image$$region_name$$Base Execution address of the region.
Image$$region_name$$Length Execution region length in bytes (multiple of 4).
Image$$region_name$$Limit Address of the byte beyond the end of the execution region.
Image$$region_name$$ZI$$Base Execution address of the ZI output section in this region.
Image$$region_name$$ZI$$Length Length of the ZI output section in bytes (multiple of 4).
Image$$region_name$$ZI$$Limit Address of the byte beyond
region_name请看我的scatter文件:
.....
BB_DATA +0x0
{
* (+RW, +ZI)
}
.......
bootloader会根据|Image$$BB_DATA$$ZI$$Base|和|Image$$BB_DATA$$ZI$$Length|去初始化
这块内存的。
然后发现说是:Linker-defined symbols are defined by armlink only when your code references them.
也就是就是说你在.s,.c等地方引用的时候,armlink才为你生成,而且.o的名字是anon$$obj.o,搞不懂ARM老喜欢搞些$$,是不是拜金啊。
^_^。