分散加载文件是 sct 格式文件。
格式:
1. 每个加载域的加载地址和最大尺寸
2. 每个加载域的属性
3. 从每个加载域派生的执行域
4. 每个执行域的执行地址和最大尺寸
5. 每个执行域的输入节
特点:
1. 编译后输出的映像文件中各断是首位相连,中间没有空闲的区域。
2. scatter file
用于将编译后的映像文件中的特定段加载到多个分散的指定内存区域
3. 有两类域:执行域
,加载域
,从哪里取址,哪里就是执行域
4. 加载域
:就是编译之后得到的二进制文件烧写到rom中的这一段区域,所有的代码r0,预定义变量rw,堆栈之类和清不清空无关紧要的大片内存区域Zi,都在这其中
5. 执行域
:把加载域进行解压缩后的样子。例如:RO没有变动还是在ROM中,RW被移动到了SRAM中,而ZI被放置在SDRAM中。
6. scatter file
本身并不能对映像实现“解压缩”,编译器读入 scatter
文件后会根据其中的各种地址生成启动代码了,实现对映像的加载,而这一段代码是 *(inRoot&&Sections)
它是 __main()
的一部分。这就是在汇编启动代码最后跳转到__main()而不是 main()
的原因。
7. 起始地址与加载域重合的执行域称为 root region
, *(inRoot&&Sections)
必须放在这个执行域中,否则连接的时候会报错。*(+RO)
包含了 *(inRoot&&Sections)
,所以如果在 root region
中用到了 *(+RO)
可以不再指定 *(InRoot&&Sections)
。
8. 程序正确编译生成目标文件后,就会连接成可执行的文件,在这个过程中,要用到分散加载文件,它决定可执行代码在存储器中存放的位置。
LR_IROM1 0x00000000 0x00002000 { ; 定义载入区域LR_IROM1的起始地址为0x00000000, 大小为0x2000
ER_IROM1 +0 0x00020000 { ;执行域ER_IROM1的起始地址紧接载于区域LR_IROM1的起始地址,即为0x00000000, 大小为0x