### 散装加载技术概述 #### 一、文档说明与翻译背景 - **文档来源**:本翻译基于ARM公司的技术文档《Application Note Scatter Loading》,文档编号ARMDAI0048A,首次发布于1998年1月。版权所有为Advanced RISC Machines Ltd (ARM)1998。 - **翻译说明**:本文档旨在介绍ARM链接器的一项高级功能——散装加载(Scatter loading),该功能允许开发者将程序镜像分割成多个独立的部分,并将它们放置在不同的内存区域中。 #### 二、简介 **散装加载(Scatter loading)**是一种由ARM链接器提供的机制,它使得程序执行镜像能够被分割成若干个独立的“域”(regions),每个域都可以独立地定位在内存的不同位置。这一特性对于嵌入式系统的内存管理尤为重要,因为它支持更加精细的内存布局控制。 #### 三、加载时域与运行时域 **加载时域(Load Regions)**与**运行时域(Execution Regions)**是散装加载机制中的两个核心概念: - **加载时域(Load Region)**:指程序在初始加载时所占用的内存区域。这些区域可能包含在ROM或Flash等非易失性存储器中。 - **运行时域(Execution Region)**:指程序运行过程中实际使用的内存区域,通常是RAM等易失性存储器。为了提高性能,某些数据或代码可能需要从加载时域移动到运行时域。 #### 四、使用-RO和-RW选项放置运行时域 **-RO** 和 **-RW** 是链接器命令行参数,用于指定镜像中的只读和可读写数据段在运行时的内存位置: - **-RO** 选项:用于指定只读数据段在运行时的内存位置。 - **-RW** 选项:用于指定可读写数据段在运行时的内存位置。 ##### 4.1.1 链接器预定义符号 链接器提供了多个预定义符号来帮助描述不同类型的内存区域,例如: - **_SDAT**: 用于标识静态数据的起始地址。 - **_EDAT**: 用于标识静态数据的结束地址。 - **_SBSS**: 用于标识未初始化数据的起始地址。 - **_EBSS**: 用于标识未初始化数据的结束地址。 - **_SREADONLY**: 用于标识只读数据的起始地址。 - **_EREAONLY**: 用于标识只读数据的结束地址。 ##### 4.2 示例 **示例**展示了如何使用-RO和-RW选项来配置镜像中的数据段位置。 - **4.2.1 初始化代码**:演示了如何配置初始化代码段的位置。 - **4.2.2 子程序代码**:演示了如何配置子程序代码段的位置。 - **4.2.3 实验**:提供了一个简单的实验示例,帮助理解-RO和-RW选项的用法。 #### 五、使用散装加载放置域 **散装加载**提供了更灵活的方式来指定程序镜像各部分在内存中的位置: - **5.1 命令行选项**:介绍了一些用于散装加载配置的命令行选项。 - **5.2 镜像格式**:描述了镜像文件的格式,包括不同类型的域以及它们如何在文件中表示。 - **5.3 链接器预定义符号**:进一步扩展了第四节中提到的预定义符号列表,增加了更多用于散装加载场景的符号。 - **5.4 区域排序(Area Ordering)**:解释了不同区域在内存中的相对位置是如何被确定的。 - **5.5 散装加载和长距离跳转**:讨论了当程序从一个域跳转到另一个域时可能遇到的问题及解决方案。 - **5.6 描述文件**:详细介绍如何编写描述文件来指导链接器如何进行散装加载操作。 ##### 5.6.1 提示 描述文件的编写过程中的一些重要提示,例如: - 如何正确地指定不同区域的起始地址和长度。 - 如何处理重叠区域。 - 如何确保所有必要的数据都被正确加载。 #### 六、散装加载示例 提供了三个具体的散装加载示例,每个示例都包括: - **6.1 示例1** - **内存映射**:描述了第一个示例中的内存布局。 - **镜像属性**:列出该示例中镜像的关键属性。 - **描述文件**:展示了用于该示例的描述文件。 - **符号表**:展示了经过链接后生成的符号表。 - **6.2 示例2** - **内存映射**:描述了第二个示例中的内存布局。 - **镜像属性**:列出该示例中镜像的关键属性。 - **描述文件**:展示了用于该示例的描述文件。 - **符号表**:展示了经过链接后生成的符号表。 - **6.3 示例3** - **内存映射**:描述了第三个示例中的内存布局。 - **镜像属性**:列出该示例中镜像的关键属性。 - **描述文件**:展示了用于该示例的描述文件。 - **符号表**:展示了经过链接后生成的符号表。 #### 七、散装加载初始化代码 介绍如何使用散装加载来初始化代码,特别是在涉及复杂内存映射的情况下。 #### 八、描述文件格式 详细介绍了描述文件的格式及其各个组成部分,包括: - **8.1 加载时域描述(Load Region Description)**:如何描述加载时域。 - **8.2 运行时域描述(Execution Region Description)**:如何描述运行时域。 - **8.3 目标区域描述(Object Area Descriptions)**:如何描述镜像中的特定目标区域。 - **8.4 module-selector 模式与 area 模式**:介绍两种描述文件中的模式,以及它们之间的区别。 - **8.5 区域选择器(Area Selector)**:如何使用区域选择器来指定特定区域。 - **8.6 多匹配消歧(Disambiguating Multiple Matches)**:当存在多个可能的匹配项时,如何进行选择。 - **8.7 默认根域(已过时)**:描述了已不再推荐使用的默认根域的概念。 #### 九、参考 提供了相关的参考文献和技术资料,以便读者深入了解散装加载的相关知识。
剩余38页未读,继续阅读
- 粉丝: 67
- 资源: 10
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助