Andes 的分散聚合(SAG)机制
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
- EDM安全访问机制应用方案(02-12)
- 在晶心平台运行具 OSC 的 FreeRTOS(01-08)
- 8051 与 AndesCoreTM 的软件差异与移植(07-29)
- Andes SAG应用实例(12-04)
- 单片机POCSAG码检错及纠错(06-26)