分散加载描述文件
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 小节中介绍。 简单存储器映射示例
加载区描述的 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 给出了一个典型的执行区 描述的内容及结构。
A::=(BC)+(D|E)表示定义 A 可扩展为 BCD,BCE,BCBCD,BCBCE,BCBCBCD,或 BCBCBCE
等
7.5.2.2 分散加载描述语法概述 分散加载描述使用前面所述的 BNF 语法,并在 BNF 定义中添加了换行和空格,以提高
可读性。它们在分散加载定义中不是必要的,如果存在于文件中,则被忽略。
复杂存储器映射示例
图 7-8 一个复杂存储器映射的分散加载描述文件
图 7-9 一个复杂存储器映射
图 7-8 中的分散加载描述将 program1.o 和 program2.o 文件中的节加载到与图 79 所示的映射相对应的存储器中。 这种复杂的存储器映射是不可能只使用基本的链接命令 行选项就实现的。
7.5.1 分散加载机制
7.5.1.1 何时使用分散加载机制 链接命令行选项提供了一些对数据和代码布局的控制,但如果要对布局进行全面控制则 需要比命令行选项更详细的指令。对于以下一些情况,就需要或最好使用分散加载描述文 件: 复杂存储器映射:代码和数据需要放在多个不同存储器区域,必须详细指明哪个节
分散描述 scatter_description 由一个或多个加载区描述 load_region_description
来定义。加载区描述的 BNF 语法如下:
Scatter_description ::= load_region_description+
其中,load_region_description 由加载区名、属性或尺寸说明符(可选)以及一个 或多个执行区描述 execution_region_description 构成。执行区描述的 BNF 语法如下:
load_region_description ::= load_region_name (base_address | ("+" offset)) [attributes] [max_size] "{" execution_region_description+ "}"
其中,execution_region_description 由执行区名、基址,属性或尺寸说明符(可选) 以及一个或多个输入节描述 input_section_description 构成。输入节描述 BNF 语法如下:
图 7-6 一个简单存储器映射的分散加载描述文件
图 7-7 一个简单存储器映射
图 7-6 中的分散加载描述将目标文件加载到与图 7-7 所示的映射相对应的存储器中。 区的最大尺寸指定是可选的,但只是允许链接器检查区是否超出边界。这个例子中分散加载 描述文件的作用,与使用链接命令选项--ro-base 0x0 和--rw-base 0x10000 是一样的。
7.5 分散加载描述文件
在 7.3 节中已经简单介绍了映像的组成,也介绍了如何用命令选项来构建简单结构的 映像。要构建映像的存储器映射,链接器必须有:描述节如何分组成区的分组信息、描述映 像区在存储器映射中的放置地址的放置信息。
分散加载机制允许为链接器指定映像的存储器映射信息,可实现对映像组件分组和布局 的全面控制。分散加载通常仅用于具有复杂存储器映射的映像(尽管也可用于简单映像), 也就是适合加载和执行时内存映射中的多个区是分散的情况。本节将对 armlink 所使用的 分散加载描述文件作详细介绍。
execution_region_description ::=
exec_region_name (base_address | "+" offset) [attribute_list][max_size | "–" length]
"{" input_section_description*
"}"
表 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
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 )* ")" ]
7.5.2 分散加载描述文件的语法
分散加载描述文件是一个文本文件,它向链接器描述目标系统的存储器映射。如果通过 命令行使用链接器,则描述文件的扩展名并不重要的。分散加载描述文件指定:
每个加载区的加载地址和最大尺寸;
每个加载区的属性; 从每个加载区派生的执行区; 每个执行区的执行地址和最大尺寸; 每个执行区的输入节。 从描述文件的格式中就可看出加载区、执行区和输入节的层次关系。 7.5.2.1 BNF 表示法和语法 分散加载描述文件由分散描述组成,分散加载描述使用 BNF(Backus-Naur Form) 语法。BNF 范式是一种用来描述计算机语言语法的符号集,表 7-6 概要地描述了分散加载 描述文件中所使用的 BNF 符号及语法。