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
存储器相关文章:存储器原理
评论