ARM 处理器的分散加载及特殊应用研究
摘要 从 ARM ELF 目标文件主要构成出发,详细介绍了分散加载的基本原理、分散加载文件的语法 、
分散加载时连接器生成的预定义符号及要重新实现的函数等;以定位目标外设和定义超大型结构体数组两
项应用来加以说明,并给出完整的工程实例和 Bootloader 代码。这些都已经在实际工程中多次应用和验
证,是笔者实际工程项目的萃取。
关键词 分散加载 嵌入式系统 Scatter Loading Bootloader ARM ELF
引 言
在当今的嵌入式系统设计中,ARM 处理器以价格便宜、功耗低、集成度高、外设资源丰富和易于使用
的特点而得到广泛的应用;在速度和性能方面已达到或超过部分 PC104 嵌入式计算机的性能,而成本却
比相应的 PC104 计算机低很多,广泛应用于手机、GPS 接收机、地图导航、路由器、以太网交换机及其
他民用和工业电子设备。
在 一个 采 用 ARM 处 理 器 的 实 时 嵌 入式 系 统 中 , 目标 硬 件 常 常 由 Flash 、 SRAM 、 SDRAM 和
NVRAM(非易失性 RAM)等存储器组成,并定位于不同的物理地址范围,那么,怎样通过软件更好地访问
和利用这些不同的存储器并让系统高效地运行?分散加载(scatter loading)就提供了这样一种机制。它可
以将内存变量定位于不同的物理地址上的存储器或端口,通过访问内存变量即可达到访问外部存储器或外
设的目的;同时通过分散加载,让大多数程序代码在高速的内部 RAM 中运行,从而使得系统的实时性大
大增强。
1 ARM ELF 目标文件的主要构成
ARM ELF(Executable and Linking Format)目标文件主要由.Text 段、.Data 段、.BSS 段构成,
其他段如.debug 段、.comment 段等与本文关系不大,不作介绍。
.Text 段由可执行代码组成, 段类型为 Code,属性为 RO;
.Data 段由已初始化数据组成,段类型为 Data,属性为 RO;
.BSS 段由未初始化数据组成, 段类型为 Zero,属性为 RW,在应用程序启动时对该段的数据初始化为
零。如果在分散加载文件中指定了 UNINIT 属性,则在应用程序启动时不初始化该段。
2 分散加载的基本原理
假设一个采用 ARM 处理器的实时嵌入式系统目标硬件的存储器由 ROM 存储器和 RAM 存储器组成。
当一个嵌入式系统在仿真环境下调试完毕,需要脱机运行的时候,就需要将源程序编译连接成可执行目标
代码并烧写到 ROM 存储器中。由于 ROM 存储器存取数据的速率比 RAM 存储器慢,因此,让程序在
ROM 存储器中运行。CPU 每次取指令和取数据操作都要访问 ROM 存储器,这样需要在 CPU 的总线周期
中插入等待周期,通过降低总线的速率来满足访问慢速的 ROM 存储器,这样势必会降低 CPU 的运行速
率和效率,因此,分散加载就显得非常必要。
ARM 的连接器提供了一种分散加载机制,在连接时可以根据分散加载文件(.scf 文件)中指定的存储器
分配方案,将可执行镜像文件分成指定的分区并定位于指定的存储器物理地址。这样,当嵌入式系统在复
位或重新上电时,在对 CPU 相应寄存器进行初始化后,首先执行 ROM 存储器的 Bootloader(自举) 代码,
根据连接时的存储器分配方案,将相应代码和数据由加载地址拷贝到运行地址,这样,定位在 RAM 存储