分散加载描述文件
合集下载
相关主题
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
分散描述 scatter_description 由一个或多个加载区描述 load_region_description
来定义。加载区描述的 BNF 语法如下:
Scatter_description ::= load_region_description+
其中,load_region_description 由加载区名、属性或尺寸说明符(可选)以及一个 或多个执行区描述 execution_region_description 构成。执行区描述的 BNF 语法如下:
图 7-6 一个简单存储器映射的分散加载描述文件
图 7-7 一个简单存储器映射
图 7-6 中的分散加载描述将目标文件加载到与图 7-7 所示的映射相对应的存储器中。 区的最大尺寸指定是可选的,但只是允许链接器检查区是否超出边界。这个例子中分散加载 描述文件的作用,与使用链接命令选项--ro-base 0x0 和--rw-base 0x10000 是一样的。
[A]
可选元素 A。例如,A::=B[C]D 表示定义 A 可以扩展为 BD 或 BCD
A+
ຫໍສະໝຸດ Baidu
元素 A 可以出现一次或多次。例如,A::= B+表示定义 A 可以扩展为 B、BB 或 BBB 等
A*
元素 A 可以不出现或多次出现
A|B
出现元素 A 或 B,但不能同时出现
(AB)
元素 A 和 B 组合在一起。这在使用|操作符时,或重复复杂模式时尤其适用。例如,
input_section_selector ::= ("+" input_section_attr | input_section_pattern |
input_symbol_pattern)
图 7-10 给出了一个典型的分散加载描述文件的内容和组织结构。
图 7-10 一个典型分散加载描述文件的结构
其中,input_section_description 由源模块选择模式 module_select_pattern,以 及一个或多个输入节选择器 input_section_selector(可选)组成。输入节描述及输入节 选择器的 BNF 语法如下:
input_section_description ::= module_select_pattern [ "(" input_section_selector ( "," input_section_selector )* ")" ]
放在哪个存储器空间。 不同存储器类型:许多系统包含 FLASH、ROM、SDRAM 和快速 SRAM。利用分
散加载可将代码和数据放置在最适合的存储器类型中。例如,中断代码可能放在快 速 SRAM 中,以改进中断响应时间,而将不频繁使用的配置信息可能放在较慢的 FLASH 中。 存储器映射 I/O:分散加载机制可将数据节精确放在存储器的某个地址,便于访问 外设映射内存。 固定位置的函数:可以将函数放在存储器中的一个固定位置,即使周围的应用程序 已经被修改并重新编译。 使用符号识别堆和栈:链接程序时,分散加载机制可为堆和栈的位置定义符号。 在实现嵌入式系统时,通常会需要使用分散加载机制,因为这些系统一般都会使用 ROM、RAM 和存储器映射 I/O。 注意,如果为 Cortex-M3 结构的处理器编译程序,此处理器结构有着一个固定的内存 映射,可以使用分散加载文件来定义栈和堆。 链接时如要使用分散加载文件,则需使用链接命令选项--scatter description_file, 详细内容参考 7.2 节。 7.5.1.2 为分散加载所定义的符号 当 armlink 使用分散加载描述文件创建映像时,它将创建一些区相关符号,在 7.4 节 中已作详细介绍。仅当代码引用这些特殊符号时,链接器才创建它们。 当分散加载描述文件被使用时,7.4 节中的符号 Image$$RW$$Base、 Image$$RW$$Limit、Image$$RO$$Base、Image$$RO$$Limit、 Image$$ZI$$Base 和 Image$$ZI$$Limit 不被定义。 若使用分散加载文件,但不指定任何区名并且不使用__user_initial_stackheap(), 则库将生成一个错误信息。
复杂存储器映射示例
图 7-8 一个复杂存储器映射的分散加载描述文件
图 7-9 一个复杂存储器映射
图 7-8 中的分散加载描述将 program1.o 和 program2.o 文件中的节加载到与图 79 所示的映射相对应的存储器中。 这种复杂的存储器映射是不可能只使用基本的链接命令 行选项就实现的。
execution_region_description ::=
exec_region_name (base_address | "+" offset) [attribute_list][max_size | "–" length]
"{" input_section_description*
"}"
7.5.1 分散加载机制
7.5.1.1 何时使用分散加载机制 链接命令行选项提供了一些对数据和代码布局的控制,但如果要对布局进行全面控制则 需要比命令行选项更详细的指令。对于以下一些情况,就需要或最好使用分散加载描述文 件: 复杂存储器映射:代码和数据需要放在多个不同存储器区域,必须详细指明哪个节
load_region_description ::= load_region_name (base_address | ("+" offset)) [attributes] [max_size] "{" execution_region_description+ "}"
其中,execution_region_description 由执行区名、基址,属性或尺寸说明符(可选) 以及一个或多个输入节描述 input_section_description 构成。输入节描述 BNF 语法如下:
7.5.1.3 使用分散加载描述文件指定栈和堆 除用分散加载描述文件指定堆和栈外,ARM C 库还提供__user_initial_stackheap() 函数实现堆和栈,并能从给出的分散加载描述信息中自动选择 1 个来实现。 为选择有两个区的内存模型,在分散加载描述文件中分别以 ARM_LIB_HEAP 和 ARM_LIB_STACK 定义两个具有 EMPTY 属性特别执行区。这将促使库选择非默认情况, 使用符号 Image$$ARM_LIB_STACK$$Base、 Image$$ARM_LIB_STACK$$ZI$$Limit、Image$$ARM_LIB_HEAP$$Base 和 Image$$ARM_LIB_HEAP$$ZI$$Limit 来实现堆和栈。默认情况是使用 __user_initial_stackheap()的实现。 因为仅 ARM_LIB_STACK 或 ARM_LIB_HEAP 区能被指定大小,且必须分配大小。 通过定义一个单执行区 ARM_LIB_STACKHEAP,其属性为 EMPTY,可强制 __user_initial_stackheap() 来组合栈/堆区。这促使__user_initial_stackheap()使用 Image$$ARM_LIB_STACKHEAP$$Base 和 Image$$ARM_LIB_STACKHEAP$$ZI$$Limit 符号的值。注意,如果重新执行 __user_initial_stackheap() ,这将覆盖库中所有相关栈和堆的实现。 7.5.1.4 分散加载描述文件与存储器映射之间的关系 为了描述分散加载描述文件与存储器映射之间的关系,下面通过 2 个例子作简单说明, 详细的语法将在 7.5.2 小节中介绍。 简单存储器映射示例
7.5 分散加载描述文件
在 7.3 节中已经简单介绍了映像的组成,也介绍了如何用命令选项来构建简单结构的 映像。要构建映像的存储器映射,链接器必须有:描述节如何分组成区的分组信息、描述映 像区在存储器映射中的放置地址的放置信息。
分散加载机制允许为链接器指定映像的存储器映射信息,可实现对映像组件分组和布局 的全面控制。分散加载通常仅用于具有复杂存储器映射的映像(尽管也可用于简单映像), 也就是适合加载和执行时内存映射中的多个区是分散的情况。本节将对 armlink 所使用的 分散加载描述文件作详细介绍。
7.5.2 分散加载描述文件的语法
分散加载描述文件是一个文本文件,它向链接器描述目标系统的存储器映射。如果通过 命令行使用链接器,则描述文件的扩展名并不重要的。分散加载描述文件指定:
每个加载区的加载地址和最大尺寸;
每个加载区的属性; 从每个加载区派生的执行区; 每个执行区的执行地址和最大尺寸; 每个执行区的输入节。 从描述文件的格式中就可看出加载区、执行区和输入节的层次关系。 7.5.2.1 BNF 表示法和语法 分散加载描述文件由分散描述组成,分散加载描述使用 BNF(Backus-Naur Form) 语法。BNF 范式是一种用来描述计算机语言语法的符号集,表 7-6 概要地描述了分散加载 描述文件中所使用的 BNF 符号及语法。
7.5.2.3 加载区描述的语法 加载区描述一般包含:加载区名称(链接器使用它识别不同的加载区)、基址(加载视 图中的代码和数据的起始地址)、属性(可选)、最大尺寸(可选)、执行区列表(这些执 行区标识执行视图中模块的类型和位置)。图 7-11 给出了一个典型加载区描述的内容及结 构。
图 7-11 一个典型加载区描述的结构
加载区描述的 BNF 语法见 7.5.2.2 的内容,其中: load_region_name 是加载区名,链接器为每个执行区生成一个 Load$$exec_r
egion_name$$base 符号,这个符号保存执行区地址。尽管如此,load_regio n_name 用来区分每个区,而不用来生成 Load$$region_name 符号。注意, 为调试程序创建的映像需要每个区有唯一的基址,因为调试程序必须在各区的加载 地址处加载区。重叠的加载区地址将导致部分映像被覆盖。但是,加载程序或操作 系统可以正确地加载地址重叠的位置独立区,它会将一个或多个位置独立区自动移 到不同的地址处。 base_address 用于指定链接时区中目标文件的地址。base_address 必须是一 个字对齐数值。 +offset 用于描述基址,此地址从前一个加载区末尾偏移 offset 个字节。offset 的值必须能被 4 整除。若是第一个加载区,那么+offset 表示基址从 0 之后的第 o ffset 个字节开始。 attribute_list 用于指定加载区内容的属性。其中,ABSOLUTE 表示绝对地址、P I 表示位置独立、RELOC 表示可重定位、OVERLAY 表示重叠、NOCOMPRESS 表示必须不被压缩、ALIGN alignment 指定对齐限制,对齐值可以从 4 到 align ment,其中 alignment 必须是 2 的正幂。ABSOLUTE、PI、RELOC、OVERL AY 四种属性,只能指定为其中之一,默认加载区属性是 ABSOLUTE。 max_size 用于指定加载区最大长度。若加载区的长度超过 max_size 指定值, 则 armlink 将生成一个错误。 execution_region_description 是执行区描述,用于指定执行区名字,地址和内 容,后面将作详细介绍。 7.5.2.4 执行区描述的语法 执行区描述包含:名称、基址(绝对的或相对的)、最大尺寸(可选)、属性(可选) 以及一个或多个输入节列表(放在本执行区中的模块)。图 7-12 给出了一个典型的执行区 描述的内容及结构。
表 7-6 BNF 符号及语法
符号
描述
"
双引号内的字符表示其本身,通常用于表示自身为 BNF 语法部分的字符。例如,定义 B"+"C,
它只能替换为 B+C。而定义 B+C 则可以替换为 BC、BBC 或 BBBC
A::=B
将 A 定义为 B。例如,A::= B"+"|C 表示 A 相当于 B+或 C。::=表示法用于定义相对组件而 言的高级结构,其中每个组件中还可能有一个::=的定义,是对更简单的组件进行的定义。例如, A::=B 以及 B::=C|D 表示定义 A 相当于 C 或 D
A::=(BC)+(D|E)表示定义 A 可扩展为 BCD,BCE,BCBCD,BCBCE,BCBCBCD,或 BCBCBCE
等
7.5.2.2 分散加载描述语法概述 分散加载描述使用前面所述的 BNF 语法,并在 BNF 定义中添加了换行和空格,以提高
可读性。它们在分散加载定义中不是必要的,如果存在于文件中,则被忽略。