新聞中心

EEPW首頁 > 嵌入式系統(tǒng) > 設(shè)計(jì)應(yīng)用 > Andes 的分散聚合(SAG)機(jī)制

Andes 的分散聚合(SAG)機(jī)制

作者: 時(shí)間:2014-09-22 來源:電子產(chǎn)品世界 收藏

   的分散聚合()機(jī)制

本文引用地址:http://m.butianyuan.cn/article/263192.htm

  在嵌入式系統(tǒng)設(shè)計(jì)中,通常使用不同的存儲(chǔ)器,如Flash、SRAM、SDRAM,并位于不同的物理地址空間,怎樣更好地利用這些不同的存儲(chǔ)器并讓系統(tǒng)高效地運(yùn)行呢?通常這需要復(fù)雜的link script來管理實(shí)現(xiàn),而提供了分散聚合(, Scattering-And-Gathering)機(jī)制,機(jī)制能夠?qū)⒓虞d和運(yùn)行時(shí)存儲(chǔ)器中的代碼和數(shù)據(jù)描述在一個(gè)SAG格式的文本描述文件中,并通過link generator tool將SAG文件轉(zhuǎn)化為標(biāo)準(zhǔn)GNU的link script文件,以供鏈接時(shí)使用。采用的分散聚合機(jī)制,不僅可以幫助工程師清晰的描述存儲(chǔ)器的使用情況,更可以避免使用復(fù)雜的標(biāo)準(zhǔn)linker腳本語言 。本文詳細(xì)介紹了SAG語法格式,并以實(shí)際工程為例,闡述SAG的使用方法和益處。

  1.Andes ELF 的目標(biāo)文件的構(gòu)成

  Andes使用標(biāo)準(zhǔn)的GNU link script格式,Andes的目標(biāo)文件也遵行標(biāo)準(zhǔn)的ELF(Executable and Linking Format)格式。

  ELF目標(biāo)文件主要由 .text段 .data段 .bss段,還有一些其它的段如:.debug .comment段。

  下面以一個(gè)簡(jiǎn)單的link script的例子作為說明:

    

 

  SECTIONS是link script語法中的關(guān)鍵command,它用來描述輸出文件的內(nèi)存布局。例如上例中就含.text, .data, .bss三個(gè)部分。

  .=0x10000; 其中的.是location counter(LC)。表示.text段虛擬地址從0x10000開始的。

  AT用來說明加載地址,AT(0)表示.text段的加載地址是0。{ *(.text) },這個(gè)表示輸出文件的.text段內(nèi)容由所有輸入文件()的.text段組成。后面的一個(gè). = 0x40000。如果沒有這個(gè)賦值,那么LC應(yīng)該等于0x10000+sizeof(text段),這里強(qiáng)制指定LC=0x40000.表明后面的.data段的虛擬地址從0x40000開始。

  LOADADDR用來得到加載地址,此處.data段的加載地址是AT(LOADADDR (.text) + SIZEOF (.text)),它緊接著.text段,.data為所有輸入目標(biāo)文件的.data段構(gòu)成。同理,.bss段的虛擬地址是緊接著.data段虛擬地址之后,而加載地址是緊接著.data段加載地址之后的。.bss段由所有輸入目標(biāo)文件的.bss段組成。

  通常在實(shí)際使用中的link script會(huì)更加的復(fù)雜,SAG機(jī)制能夠很好的簡(jiǎn)化link script的設(shè)計(jì),那接下來將對(duì)SAG機(jī)制作介紹。

  2.Andes SAG語法

  SAG使用巴科斯范式(BNF notation)中的以下幾種符號(hào)表示:

    

 

  SAG 格式總覽

  SAG語法格式由:load regions,execution regions,input sections等幾部分組成,如下圖所示:

    

 

  2.1 關(guān)于LMA和VMA

  一般在嵌入式系統(tǒng)中,程序存儲(chǔ)和運(yùn)行在不同的地址空間,LMA表示的是程序裝載地址,VMA表示的是程序運(yùn)行地址,LMA不等于VMA時(shí)程序在加載后不可直接運(yùn)行,程序運(yùn)行前,要把程序的內(nèi)容,拷貝到對(duì)應(yīng)的內(nèi)存地址處,才能正確地運(yùn)行。

  2.2 header格式

    

 

  當(dāng)要使用用戶自定義的section時(shí),須要使用USER_SECTIONS這個(gè)關(guān)鍵字。

  2.3 Load Region(加載區(qū))

  Load Region格式為:

    

 

  load_region_name用來表示某個(gè)程序加載區(qū)的名稱。

  address表示的是LMA。

  offset表示的是偏移量,當(dāng)此時(shí)是第一個(gè)load region時(shí)表示的是與0地址的偏移量,當(dāng)表示的不是第一個(gè)load region時(shí),表示的是與前一個(gè)load region結(jié)尾處的偏移量。

  load_attr 表示屬性,現(xiàn)在可以設(shè)置為ALIGN alignment, 如ALIGN 0x4

  max_size 表示該加載區(qū)域的最大值。

  例子:

  LOAD_ROM_1 0x0000 ALIGN 0x4 0x10000

  在這個(gè)例子中l(wèi)oad_region_name是:LOAD_ROM_1,LMA是0x0000,以4-byte對(duì)齊,

  max_size是64k

  2.4 Execution Region(執(zhí)行區(qū))

  Execution Region格式為:

    

 

  exe_region_name 用于表示某個(gè)程序執(zhí)行區(qū)的名稱

  address表示的是VMA。

  offset當(dāng)表示的是第一個(gè)execution region,表示的是與該加載區(qū)的偏移量,當(dāng)表示的不是第一execution region時(shí),offset表示的是前一個(gè)execution region結(jié)尾處的偏移量。

  exe_attr表示屬性,如可以設(shè)置為ALIGN alignment,如ALIGN 0x4

  max_size表示該execution region的最大值。

  例子:

  EXEC_ROM_1 0x0000 ALIGN 0x4 0x8000

  在這個(gè)例子中exe_region_name是EXEC_ROM_1,它的VMA是0x0000, 以4-byte對(duì)齊,max_size是32k

  2.5 Input Section(輸入段)

  Input Section的描述格式為:

    

 

  此處:

  module_select_pattern 可以是目標(biāo)文件名

  input_attr 可以是KEEP,該屬性可以保證該section在鏈接時(shí)不會(huì)被remove掉,或者是SORT,用于排序。

  例子如:

  program1.o KEEP(+RO)

  此時(shí)該input section將包含目標(biāo)文件program1.o中所有的read-only section,由于加了KEEP,所以所添加的section在鏈接的時(shí)候不會(huì)被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準(zhǔn)備一個(gè)初始值num。

  VAR 用于設(shè)定并初始化一個(gè)變量。如VAR _ILM_BASE = 0x00600000。

  2.6 Execution Overlay Region(overlay的執(zhí)行區(qū))

  當(dāng)使用overlay功能時(shí),需要設(shè)定Execution Overlay Region,設(shè)定格式為:

    

 

  它在后面加了個(gè):OVERLAY的關(guān)鍵字。

  pagesize后面表示Overlay的大小,當(dāng)是0時(shí),表示software Overlay,其它的設(shè)置和前面的execution region相同。

  2.7 Overlay Input Section(overlay的輸入段)

  當(dāng)使用overlay功能時(shí),要設(shè)置Overlay Input Section,它和前面的Input Section類似。

  3.例子

  如下例子所示的效果是:

  在一個(gè)系統(tǒng)中,從0x0000開始,大小為0x2000的是ROM1, 從0x4000開始,大小為0x8000的是ROM2,此時(shí)我們需要將目標(biāo)文件program1.o的RO和RW,ZI data。 存放在ROM1中,將其它目標(biāo)文件的 .text,RO,RW, ZI存放在ROM2中。此時(shí)的LMA效果對(duì)應(yīng)于下圖的左側(cè)。

  同時(shí)需要將目標(biāo)文件program1.o中的RW, ZI的運(yùn)行地址設(shè)置在從0x10000開始的大小為0x8000的DRAM上,將其它目標(biāo)文件的RW,ZI的運(yùn)行地址設(shè)置在從0x18000開始,大小為0x8000的SRAM上。此時(shí)的VMA效果對(duì)應(yīng)于下圖的右側(cè)。

    

 

  該例子中program1.o中的RO和其它目標(biāo)文件中的.text, RO的LMA和VMA是相等的,此時(shí)所有的RW,ZI的加載區(qū)域是分別在ROM1和ROM2上,但是運(yùn)行地址是分別在DRAM和SRAM上,所以RW,ZI的LMA不等于VMA,所以在程序使用到RW, ZI所代表的.data,.bss段之前需要將它們從加載區(qū)復(fù)制到運(yùn)行區(qū),以達(dá)到所圖中右側(cè)所示的效果。

    

 

  對(duì)應(yīng)的SAG可以這樣設(shè)計(jì):

  利用SAG機(jī)制,除了快速設(shè)計(jì)上列所示的系統(tǒng)中存儲(chǔ)的分配機(jī)制,還可以快速的進(jìn)行overlay程序的設(shè)計(jì),overlay程序主要是用于分時(shí)重復(fù)利用快速但存儲(chǔ)空間有限的存儲(chǔ)器。

  關(guān)于如何在Andes上進(jìn)行overlay程序的編寫,請(qǐng)參考我們另外一篇文檔:http://www.andestech.com/cn/news-events/technical-article/2013/2013-12-04.pdf

  4、將SAG文件轉(zhuǎn)化成linker script

  在AndeSight 或者BSP package中提供了叫做nds_ldsag的工具,該工具可以將SAG文件轉(zhuǎn)化成標(biāo)準(zhǔn)的GUN link script文件。在cygwin下,執(zhí)行方法如下,filename.ld就是我們希望獲得的link script文件。

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

  5、結(jié)語

  Andes提供的通俗、易用的SAG描述語言,可以幫助工程師根據(jù)系統(tǒng)中的存儲(chǔ)設(shè)備的特點(diǎn),對(duì)程序的加載與運(yùn)行區(qū)域進(jìn)行很方便的設(shè)計(jì)和描述,甚至可以快速的進(jìn)行更為復(fù)雜的overlay程序的設(shè)計(jì),然后通過自動(dòng)化工具nds_ldsag將SAG描述文件轉(zhuǎn)成標(biāo)準(zhǔn)link腳本供連接器使用,從而大大提高在Andes core平臺(tái)上的軟件開發(fā)效率。

  參考文檔:

  1: BSP321 programming guide link generator

  2: The GNU Linker Manual

  

存儲(chǔ)器相關(guān)文章:存儲(chǔ)器原理




關(guān)鍵詞: Andes SAG

評(píng)論


技術(shù)專區(qū)

關(guān)閉