我是通过这搞懂的
下面是我觉得值得注意得
一.散加载文件基本点
1. 编译后输出的映像文件.bin中各段是首尾相连的,中间没有空闲的区域,他们的先后关系是根据链接时参数的先后次序决定的armlinker -file1.o file2.o …
- scatter用于将编译后的映像文件中的特定段加载到多个分散的指定内存区域有两类域(region):执行域和加载域
- 加载域:就是编译之后得到的二进制文件烧写到rom中的这一段区域,所有的代码R0、预定义变量RW、堆栈之类和清不清空无关紧要的大片内存区域ZI,都包括在其中
- 执行域:就是把加载域进行“解压缩”后的样子。比如:RO没有变动还是在ROM中,RW被移到了SRAM中,而ZI被放置在SDRAM中
5. scatter本身并不能对映像实现“解压缩”,编译器读入scatter文件之后会根据其中的各种地址生成启动代码了,实现对映像的加载,而这一段代码就是*(InRoot$$Sections)它是__main()的一部分。这就是在汇编启动代码的最后跳转到__main()而不是跳向main()的原因之一
- 起始地址与加载域重合的执行域称为root region,(InRoot Sections),所以如果在root region中用到了(+RO)可以不再指定*(InRoot$$Sections)。
- 程序正确编译生成目标文件以后,就会链接成可执行的文件,这个过程中,要用到分散加载文件,它决定可执行代码在存储器中存放的位置,这在复杂的程序(例如VIVI读Linux内核的引导)中时很重要的