新闻中心

Andes 的分散聚合(SAG)机制

来源:Andes
发布时间:[2015-03-24]

Andes 的分散聚合(SAG)机制

在嵌入式系统设计中,通常使用不同的存储器,如Flash、SRAM、SDRAM,并位于不同的物理地址空间,怎样更好地利用这些不同的存储器并让系统高效地运行呢?通常这需要复杂的link script来管理实现,而Andes提供了分散聚合(SAG, Scattering-And-Gathering)机制,SAG机制能够将加载和运行时存储器中的代码和数据描述在一个SAG格式的文本描述文件中,并通过link generator tool将SAG文件转化为标准GNU的link script文件,以供链接时使用。采用Andes的分散聚合机制,不仅可以帮助工程师清晰的描述存储器的使用情况,更可以避免使用复杂的标准linker脚本语言 。本文详细介绍了SAG语法格式,并以实际工程为例,阐述SAG的使用方法和益处。

1.Andes ELF 的目标文件的构成

Andes使用标准的GNU link script格式,Andes的目标文件也遵行标准的ELF(Executable and Linking Format)格式。

ELF目标文件主要由 .text段 .data段 .bss段,还有一些其它的段如:.debug .comment段。

下面以一个简单的link script的例子作为说明:

SECTIONS是link script语法中的关键command,它用来描述输出文件的内存布局。例如上例中就含.text, .data, .bss三个部分。

.=0x10000; 其中的.是location counter(LC)。表示.text段虚拟地址从0x10000开始的。

AT用来说明加载地址,AT(0)表示.text段的加载地址是0。{ *(.text) },这个表示输出文件的.text段内容由所有输入文件()的.text段组成。后面的一个. = 0x40000。如果没有这个赋值,那么LC应该等于0x10000+sizeof(text段),这里强制指定LC=0x40000.表明后面的.data段的虚拟地址从0x40000开始。

LOADADDR用来得到加载地址,此处.data段的加载地址是AT(LOADADDR (.text) + SIZEOF (.text)),它紧接着.text段,.data为所有输入目标文件的.data段构成。同理,.bss段的虚拟地址是紧接着.data段虚拟地址之后,而加载地址是紧接着.data段加载地址之后的。.bss段由所有输入目标文件的.bss段组成。

通常在实际使用中的link script会更加的复杂,SAG机制能够很好的简化link script的设计,那接下来将对SAG机制作介绍。

2.Andes SAG语法

SAG使用巴科斯范式(BNF notation)中的以下几种符号表示:

SAG 格式总览

SAG语法格式由:load regions,execution regions,input sections等几部分组成,如下图所示:

2.1 关于LMA和VMA

一般在嵌入式系统中,程序存储和运行在不同的地址空间,LMA表示的是程序装载地址,VMA表示的是程序运行地址,LMA不等于VMA时程序在加载后不可直接运行,程序运行前,要把程序的内容,拷贝到对应的内存地址处,才能正确地运行。

2.2 header格式

当要使用用户自定义的section时,须要使用USER_SECTIONS这个关键字。

2.3 Load Region(加载区)

Load Region格式为:

load_region_name用来表示某个程序加载区的名称。

address表示的是LMA。

offset表示的是偏移量,当此时是第一个load region时表示的是与0地址的偏移量,当表示的不是第一个load region时,表示的是与前一个load region结尾处的偏移量。

load_attr 表示属性,现在可以设置为ALIGN alignment, 如ALIGN 0x4

max_size 表示该加载区域的最大值。

例子:

LOAD_ROM_1 0x0000 ALIGN 0x4 0x10000

在这个例子中load_region_name是:LOAD_ROM_1,LMA是0x0000,以4-byte对齐,

max_size是64k

2.4 Execution Region(执行区)

Execution Region格式为:

exe_region_name 用于表示某个程序执行区的名称

address表示的是VMA。

offset当表示的是第一个execution region,表示的是与该加载区的偏移量,当表示的不是第一execution region时,offset表示的是前一个execution region结尾处的偏移量。

exe_attr表示属性,如可以设置为ALIGN alignment,如ALIGN 0x4

max_size表示该execution region的最大值。

例子:

EXEC_ROM_1 0x0000 ALIGN 0x4 0x8000

在这个例子中exe_region_name是EXEC_ROM_1,它的VMA是0x0000, 以4-byte对齐,max_size是32k

2.5 Input Section(输入段)

Input Section的描述格式为:

此处:

module_select_pattern 可以是目标文件名

input_attr 可以是KEEP,该属性可以保证该section在链接时不会被remove掉,或者是SORT,用于排序。

例子如:

program1.o KEEP(+RO)

此时该input section将包含目标文件program1.o中所有的read-only section,由于加了KEEP,所以所添加的section在链接的时候不会被gc-section删除掉。

input_section_selector中最常用的是input section_attr。

input section_attr有以下几种:

input_section_selector中另外一种用的是input_section_pattern,

它的表示方法是 input_section_pattern ::= (.text | .data|…)。

ADDR variable 用于得到该处的VMA赋给variable。

LOADADDR variable 用于得到该处的LMA赋给variable。

STACK "=" num 为sp准备一个初始值num。

VAR 用于设定并初始化一个变量。如VAR _ILM_BASE = 0x00600000。

2.6 Execution Overlay Region(overlay的执行区)

当使用overlay功能时,需要设定Execution Overlay Region,设定格式为:

它在后面加了个:OVERLAY的关键字。

pagesize后面表示Overlay的大小,当是0时,表示software Overlay,其它的设置和前面的execution region相同。

2.7 Overlay Input Section(overlay的输入段)

当使用overlay功能时,要设置Overlay Input Section,它和前面的Input Section类似。

3.例子

如下例子所示的效果是:

在一个系统中,从0x0000开始,大小为0x2000的是ROM1, 从0x4000开始,大小为0x8000的是ROM2,此时我们需要将目标文件program1.o的RO和RW,ZI data。 存放在ROM1中,将其它目标文件的 .text,RO,RW, ZI存放在ROM2中。此时的LMA效果对应于下图的左侧。

同时需要将目标文件program1.o中的RW, ZI的运行地址设置在从0x10000开始的大小为0x8000的DRAM上,将其它目标文件的RW,ZI的运行地址设置在从0x18000开始,大小为0x8000的SRAM上。此时的VMA效果对应于下图的右侧。

该例子中program1.o中的RO和其它目标文件中的.text, RO的LMA和VMA是相等的,此时所有的RW,ZI的加载区域是分别在ROM1和ROM2上,但是运行地址是分别在DRAM和SRAM上,所以RW,ZI的LMA不等于VMA,所以在程序使用到RW, ZI所代表的.data,.bss段之前需要将它们从加载区复制到运行区,以达到所图中右侧所示的效果。

对应的SAG可以这样设计:

利用SAG机制,除了快速设计上列所示的系统中存储的分配机制,还可以快速的进行overlay程序的设计,overlay程序主要是用于分时重复利用快速但存储空间有限的存储器。

关于如何在Andes上进行overlay程序的编写,请参考我们另外一篇文档:http://www.andestech.com/cn/news-events/technical-article/2013/2013-12-04.pdf

4、将SAG文件转化成linker script

在AndeSight 或者BSP package中提供了叫做nds_ldsag的工具,该工具可以将SAG文件转化成标准的GUN link script文件。在cygwin下,执行方法如下,filename.ld就是我们希望获得的link script文件。

./nds_ldsag.exe filename.sag -o filename.ld

5、结语

Andes提供的通俗、易用的SAG描述语言,可以帮助工程师根据系统中的存储设备的特点,对程序的加载与运行区域进行很方便的设计和描述,甚至可以快速的进行更为复杂的overlay程序的设计,然后通过自动化工具nds_ldsag将SAG描述文件转成标准link脚本供连接器使用,从而大大提高在Andes core平台上的软件开发效率。

参考文档:

1: BSP321 programming guide link generator

2: The GNU Linker Manual