1. ARM Scatter-loading文件基础解析
Scatter-loading文件是ARM开发环境中用于精确控制内存布局的核心配置文件。我第一次接触这个文件是在开发一款基于Cortex-M4的工业控制器时,当时需要将关键中断向量表固定在Flash起始地址,同时把频繁访问的数据放到高速SRAM中。经过多次调试才真正理解其设计哲学。
1.1 基本架构与核心概念
Scatter-loading文件采用树状结构描述内存映射关系,主要包含两个层级:
-
加载域(Load Region):定义程序在存储设备(如Flash)中的原始布局
- 起始地址(load_address)
- 最大尺寸(max_size)
- 属性(如PI表示位置无关)
-
执行域(Execution Region):定义程序在运行时内存中的实际分布
- 执行地址(execution_address)
- 访问属性(RO/RW/ZI)
- 包含的输入段规则
典型结构示例如下:
c复制LR_1 0x08000000 0x00100000 { // 加载域:从Flash 0x08000000开始,最大1MB
ER_ROM 0x08000000 0x00040000 { // 执行域:运行时地址不变
*.o (RESET, +FIRST) // 必须放在首位的复位代码
* (+RO) // 所有只读内容
}
ER_RAM 0x20000000 0x00020000 { // 运行时重定位到RAM
* (+RW, +ZI) // 读写数据和零初始化数据
}
}
1.2 关键属性解析
ABSOLUTE vs FIXED:
- ABSOLUTE(默认):执行地址由加载器决定,通常用于可重定位代码
- FIXED:强制加载地址与执行地址相同,适合必须固定位置的代码(如中断向量)
PI(Position Independent)特性:
c复制LR_1 0x0000 PI {
ER_RO +0 PI { // 位置无关代码段
*(+RO-CO
