嵌入式软件开发之: 映像文件存储器映射调整
性:
·
域名称;
· 执行域基地址(支持绝对地址的或相对地址的);
· 执行域的最大尺寸(可选);
· 指定执行域属性;
· 一个或多个输入段描述(放在本执行区中的模块)。
图13.12显示了一个典型的执行域描述。
执行域描述符中的BNF语法为:
execution_region_description ::=
exec_region_name (base_address | + offset) [attribute_list] [max_size | –
length]
{
input_section_description+
}
其语法说明如下。
① exec_region_name 为执行域命名。(只有前31个字符有效。)
② base_address是域中对象的链接地址。base_address必须是字对齐的。
③ +offset是描述基址,它从前一个执行区的末尾偏移offset个字节。offset的值必须能被4整除。如果前面没有执行区(即,这是载入区中的第一个执行区),则+offset表示基址从它所在的载入区的基址之后offset个字节开始。如果使用+offset格式并且所在的加载域具有RELOC属性,则执行区继承该RELOC属性。但是,如果使用固定的base_address,则随后出现的offset不继承RELOC属性。
④ attribute_list指定执行区内容的属性:
· PI:位置独立。
· OVERLAY:重叠。
· ABSOLUTE:绝对地址。域的执行地址由base_designator指定。
· FIXED:固定地址。执行域的加载地址和执行地址都由base_designator指定。base_designator必须是绝对基址,或者偏移量为+0。
· EMPTY:它在执行区中保留一个已知长度的空白存储器块,通常用作堆或栈。
· PADVALUE:指定填充字的默认值,如果在域定义中指定了该属性,则必须为该属性赋值。使用该属性的例子如下。
EXEC 0x10000 PADVALUE 0xffffffff EMPTY ZEROPAD 0x2000
通过该Scatter文件描述符,创建了一个长度为0x2000的域,该域中的所有内容用0xffffffff填充。
注意 | 所指定的域值必须以字为单位。 |
· ZEROPAD 0:初始化一块内容全为0的内存区域,并将其作为一个输入段填充到ELF映像文件中。这样减少了在运行时将某段内存初始化为0的操作。
注意 | 只有根执行区可以使用ZEROPAD属性进行0初始化。对非根执行区使用ZEROPAD属性将出现警告信息,并且忽略该属性。 |
· UNINIT:指示该段为不能被初始化为0。
⑤ max_size为可选的参数,如果分配给域的存储器超过max_size字节,则它指示armlink生成错误。
⑥ -length如果指定的长度为负值,则base_address是域的结束地址。它通常与EMPTY一起使用,以表示在存储器中变小的栈。
当确定执行域属性时,注意以下几点。
① PI、OVERPLAY、FIXED和ABSOLUTE为并列关系属性,某一个执行域只能为这4种属性之一。如果没有指定,ABSOLUTE为其默认属性。
② 使用+offset格式的base_designator的执行区继承前一个执行区的属性(如果它是加载域中的第一个执行区,则继承所在加载域的属性,),或者具有ABSOLUTE属性。
③ 不能为执行域显式指定RELOC属性。该属性只能从前面的执行域或父区继承才能具有RELOC属性。
④ 被指定了PI或OVERLAP属性的执行域,不能有重叠的地址范围。但对于ABLOUTE和FIXED属性的执行域,ARM编译器不允许有重叠的地址范围。
⑤ RW段默认使用压缩属性。如果不想链接器对该段进行压缩,必须在Scatter文件中使用NOCOMPRESS显示声明。
⑥ UNINIT指定执行区中的ZI输出节(如果有)不被初始化为0。使用它可以创建包含未初始化数据或存储器映射I/O的执行区。
5.输入段描述符
输入段由以下部分组成。
· 模块名称,如目标文件名称、库成员名称或库文件名称。模块名称可以使用通配符。
· 输入段名称,或输入节属性,如READ-ONLY或CODE。
图13.13显示了输入段描述符的基本组成。
BNF语法为:
input_section_description ::=
module_select_pattern
[(
(+ input_section_attr | input_section_pattern)
([,] + input_section_attr | , input_section_pattern))*
)]
其语法说明如下。
① module_select_pattern
这是由文字文本构成的模式。“*”通配符匹配0个或多个字符,而“?”匹配任何单个字符。匹配不区分大小写。
使用*.o可以匹配所有对象。使用*可以匹配所有目标文件和库。
当满足下列条件之一时,链接器认为module_selector_pattern与输入段匹配。
· 包含输入段的目标文件与module_selector_pattern匹配。
· 包含输入段的库成员名称(不带路径名)与module_selector_pattern匹配。
· 从其中提取段的库全名(包含路径名)。如果名称包含空格,使用通配符可以简
- 基于DSP的导弹仿真器嵌入式组件设计(04-30)
- 为嵌入式软件建立统一软件系统框架的方法详介(05-23)
- 在VIM中实现对嵌入式软件的调试(08-06)
- 基于仿真的嵌入式软件白盒覆盖测试系统设计(08-26)
- 嵌入式软件运行剖面建模及测试用例生成(11-06)
- 嵌入式软件与硬件的集成测试过程研究(11-16)