分散加载描述文件

整理文档很辛苦,赏杯茶钱您下走!

免费阅读已结束,点击下载阅读编辑剩下 ...

阅读已结束,您可以下载文档离线阅读编辑

资源描述

7.5分散加载描述文件在7.3节中已经简单介绍了映像的组成,也介绍了如何用命令选项来构建简单结构的映像。要构建映像的存储器映射,链接器必须有:描述节如何分组成区的分组信息、描述映像区在存储器映射中的放置地址的放置信息。分散加载机制允许为链接器指定映像的存储器映射信息,可实现对映像组件分组和布局的全面控制。分散加载通常仅用于具有复杂存储器映射的映像(尽管也可用于简单映像),也就是适合加载和执行时内存映射中的多个区是分散的情况。本节将对armlink所使用的分散加载描述文件作详细介绍。7.5.1分散加载机制7.5.1.1何时使用分散加载机制链接命令行选项提供了一些对数据和代码布局的控制,但如果要对布局进行全面控制则需要比命令行选项更详细的指令。对于以下一些情况,就需要或昀好使用分散加载描述文件:„复杂存储器映射:代码和数据需要放在多个不同存储器区域,必须详细指明哪个节放在哪个存储器空间。„不同存储器类型:许多系统包含FLASH、ROM、SDRAM和快速SRAM。利用分散加载可将代码和数据放置在昀适合的存储器类型中。例如,中断代码可能放在快速SRAM中,以改进中断响应时间,而将不频繁使用的配置信息可能放在较慢的FLASH中。„存储器映射I/O:分散加载机制可将数据节精确放在存储器的某个地址,便于访问外设映射内存。„固定位置的函数:可以将函数放在存储器中的一个固定位置,即使周围的应用程序已经被修改并重新编译。„使用符号识别堆和栈:链接程序时,分散加载机制可为堆和栈的位置定义符号。在实现嵌入式系统时,通常会需要使用分散加载机制,因为这些系统一般都会使用ROM、RAM和存储器映射I/O。注意,如果为Cortex-M3结构的处理器编译程序,此处理器结构有着一个固定的内存映射,可以使用分散加载文件来定义栈和堆。链接时如要使用分散加载文件,则需使用链接命令选项--scatterdescription_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.5.1.3使用分散加载描述文件指定栈和堆除用分散加载描述文件指定堆和栈外,ARMC库还提供__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-6一个简单存储器映射的分散加载描述文件图7-7一个简单存储器映射图7-6中的分散加载描述将目标文件加载到与图7-7所示的映射相对应的存储器中。区的昀大尺寸指定是可选的,但只是允许链接器检查区是否超出边界。这个例子中分散加载描述文件的作用,与使用链接命令选项--ro-base0x0和--rw-base0x10000是一样的。„复杂存储器映射示例图7-8一个复杂存储器映射的分散加载描述文件图7-9一个复杂存储器映射图7-8中的分散加载描述将program1.o和program2.o文件中的节加载到与图7-9所示的映射相对应的存储器中。这种复杂的存储器映射是不可能只使用基本的链接命令行选项就实现的。7.5.2分散加载描述文件的语法分散加载描述文件是一个文本文件,它向链接器描述目标系统的存储器映射。如果通过命令行使用链接器,则描述文件的扩展名并不重要的。分散加载描述文件指定:„每个加载区的加载地址和昀大尺寸;„每个加载区的属性;„从每个加载区派生的执行区;„每个执行区的执行地址和昀大尺寸;„每个执行区的输入节。从描述文件的格式中就可看出加载区、执行区和输入节的层次关系。7.5.2.1BNF表示法和语法分散加载描述文件由分散描述组成,分散加载描述使用BNF(Backus-NaurForm)语法。BNF范式是一种用来描述计算机语言语法的符号集,表7-6概要地描述了分散加载描述文件中所使用的BNF符号及语法。表7-6BNF符号及语法符号描述双引号内的字符表示其本身,通常用于表示自身为BNF语法部分的字符。例如,定义B+C,它只能替换为B+C。而定义B+C则可以替换为BC、BBC或BBBCA::=B将A定义为B。例如,A::=B+|C表示A相当于B+或C。::=表示法用于定义相对组件而言的高级结构,其中每个组件中还可能有一个::=的定义,是对更简单的组件进行的定义。例如,A::=B以及B::=C|D表示定义A相当于C或D[A]可选元素A。例如,A::=B[C]D表示定义A可以扩展为BD或BCDA+元素A可以出现一次或多次。例如,A::=B+表示定义A可以扩展为B、BB或BBB等A*元素A可以不出现或多次出现A|B出现元素A或B,但不能同时出现(AB)元素A和B组合在一起。这在使用|操作符时,或重复复杂模式时尤其适用。例如,A::=(BC)+(D|E)表示定义A可扩展为BCD,BCE,BCBCD,BCBCE,BCBCBCD,或BCBCBCE等7.5.2.2分散加载描述语法概述分散加载描述使用前面所述的BNF语法,并在BNF定义中添加了换行和空格,以提高可读性。它们在分散加载定义中不是必要的,如果存在于文件中,则被忽略。分散描述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语法如下:execution_region_description::=exec_region_name(base_address|+offset)[attribute_list][max_size|–length]{input_section_description*}其中,input_section_description由源模块选择模式module_select_pattern,以及一个或多个输入节选择器input_section_selector(可选)组成。输入节描述及输入节选择器的BNF语法如下:input_section_description::=module_select_pattern[(input_section_selector(,input_section_selector)*)]input_section_selector::=(+input_section_attr|input_section_pattern|input_symbol_pattern)图7-10给出了一个典型的分散加载描述文件的内容和组织结构。图7-10一个典型分散加载描述文件的结构7.5.2.3加载区描述的语法加载区描述一般包含:加载区名称(链接器使用它识别不同的加载区)、基址(加载视图中的代码和数据的起始地址)、属性(可选)、昀大尺寸(可选)、执行区列表(这些执行区标识执行视图中模块的类型和位置)。图7-11给出了一个典型加载区描述的内容及结构。图7-11一个典型加载区描述的结构加载区描述的BNF语法见7.5.2.2的内容,其中:„load_region_name是加载区名,链接器为每个执行区生成一个Load$$exec_region_name$$base符号,这个符号保存执行区地址。尽管如此,load_region_name用来区分每个区,而不用来生成Load$$region_name符号。注意,为调试程序创建的映像需要每个区有唯一的基址,因为调试程序必须在各区的加载地址处加载区。重叠的加载区地址将导致部分映像被覆盖。但是,加载程序或操作系统可以正确地加载地址重叠的位置独立区,它会将一个或多个位置独立区自动移到不同的地址处。„base_address用于指定链接时区中目标文件的地址。base_address必须是一个字对齐数值。„+offset用于描述基址,此地址从前一个加载区末尾偏移offset个字节。offset的值必须能被4整除。若是第一个加载区,那么+offset表示基址从0之后的第offset个字节开始。„attribute_list用于指定加载区内容的属性。其中,ABSOLUTE表示绝对地址、PI表示位置独立、RELOC表示可重定位、OVERLAY表示重叠、NOCOMPRESS表示必须不被压缩、ALIGNalignment指定对齐限制,对齐值可以从4到alignment,其中alignment必须是2的正幂。ABSOLUTE、PI、RELOC、OVERLAY四种属性,只能指定为其中之一,默认加载区属性是ABSOLUTE。„max_size用于指定加载区昀大长度。若加载区的长度超过max_size指定值,则armlink将生成一个错误。„execution_region_description是执行区描述,用于指定执行区名字,地址和内容,后面将作详细介绍。7.5.2.4执行区描述的语法执行区描述包含:名称、基址(绝对的或相对的)、昀大尺寸(可选)、属性(可选)以及一个或多个输入节列表(放在本执行区中的模块)。图7-12给出了一个典型的执行区描述的内容及结构。图7-12一个典型执行区描述的结构执行区描述的BNF语法见7.5.2.2的内容,其中:„exec_region_name是执行区的名称。„base_address是链接是执行区中对象的地址,base_addres

1 / 11
下载文档,编辑使用

©2015-2020 m.777doc.com 三七文档.

备案号:鲁ICP备2024069028号-1 客服联系 QQ:2149211541

×
保存成功