转《http://blog.sina.com.cn/s/blog_875c3b2f0106nohz.html》
scatter基本点:
- 编译后输出的映像文件中各段是首尾相连的,中间没有空闲的区域,它们的先后关系是根据链接时参数的先后次序决定的 armlinker -file1.o file2.o ……
- scatter用于将编译后的映像文件中的特定段加载到多个分散的指定内存区域
- 有2类域region:执行域(execution region,一般是ram区域)和加载域(load region,一般是rom区域)
- 加载域:就是编译之后得到的二进制文件烧写到rom中的这一段区域,所有的代码RO、预定义变量RW、堆栈之类清不清空无关紧要的大片内存区域ZI,都包括在其中
- 执行域:就是把加载域进行‘解压缩’后的样子。比如:RO没有变动还是在ROM中,RW被移到了SRAM中,而ZI被放置在SDRAM中
- scatter本身并不能对映像实现‘解压缩’,编译器读入scatter文件之后会根据其中的各种地址生成启动代码,实现对映像的加载,而这一段代码就是* (InRoot$$Sections)它是__main()的一部分。这就是在汇编启动代码的最后跳转到__main() 而不是跳向main()的原因之一。
- 起始地址与加载域重合的执行域成为root region,* (InRoot Sections),所以如果在root region中用到了*(+RO)可以不再指定*