ARM Scatter-loading文件解析与内存优化实战

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

内容推荐

已经到底了哦
已经到底了哦