嵌入式軟件開(kāi)發(fā)之: 映像文件存儲(chǔ)器映射調(diào)整
通過(guò)該Scatter文件描述符,創(chuàng)建了一個(gè)長(zhǎng)度為0x2000的域,該域中的所有內(nèi)容用0xffffffff填充。
注意 | 所指定的域值必須以字為單位。 |
· ZEROPAD 0:初始化一塊內(nèi)容全為0的內(nèi)存區(qū)域,并將其作為一個(gè)輸入段填充到ELF映像文件中。這樣減少了在運(yùn)行時(shí)將某段內(nèi)存初始化為0的操作。
注意 | 只有根執(zhí)行區(qū)可以使用ZEROPAD屬性進(jìn)行0初始化。對(duì)非根執(zhí)行區(qū)使用ZEROPAD屬性將出現(xiàn)警告信息,并且忽略該屬性。 |
· UNINIT:指示該段為不能被初始化為0。
⑤ max_size為可選的參數(shù),如果分配給域的存儲(chǔ)器超過(guò)max_size字節(jié),則它指示armlink生成錯(cuò)誤。
⑥ -length如果指定的長(zhǎng)度為負(fù)值,則base_address是域的結(jié)束地址。它通常與EMPTY一起使用,以表示在存儲(chǔ)器中變小的棧。
當(dāng)確定執(zhí)行域?qū)傩詴r(shí),注意以下幾點(diǎn)。
① PI、OVERPLAY、FIXED和ABSOLUTE為并列關(guān)系屬性,某一個(gè)執(zhí)行域只能為這4種屬性之一。如果沒(méi)有指定,ABSOLUTE為其默認(rèn)屬性。
② 使用+offset格式的base_designator的執(zhí)行區(qū)繼承前一個(gè)執(zhí)行區(qū)的屬性(如果它是加載域中的第一個(gè)執(zhí)行區(qū),則繼承所在加載域的屬性,),或者具有ABSOLUTE屬性。
③ 不能為執(zhí)行域顯式指定RELOC屬性。該屬性只能從前面的執(zhí)行域或父區(qū)繼承才能具有RELOC屬性。
④ 被指定了PI或OVERLAP屬性的執(zhí)行域,不能有重疊的地址范圍。但對(duì)于ABLOUTE和FIXED屬性的執(zhí)行域,ARM編譯器不允許有重疊的地址范圍。
⑤ RW段默認(rèn)使用壓縮屬性。如果不想鏈接器對(duì)該段進(jìn)行壓縮,必須在Scatter文件中使用NOCOMPRESS顯示聲明。
⑥ UNINIT指定執(zhí)行區(qū)中的ZI輸出節(jié)(如果有)不被初始化為0。使用它可以創(chuàng)建包含未初始化數(shù)據(jù)或存儲(chǔ)器映射I/O的執(zhí)行區(qū)。
5.輸入段描述符
輸入段由以下部分組成。
· 模塊名稱(chēng),如目標(biāo)文件名稱(chēng)、庫(kù)成員名稱(chēng)或庫(kù)文件名稱(chēng)。模塊名稱(chēng)可以使用通配符。
· 輸入段名稱(chēng),或輸入節(jié)屬性,如READ-ONLY或CODE。
圖13.13顯示了輸入段描述符的基本組成。
BNF語(yǔ)法為:
input_section_description ::=
module_select_pattern
[(
(+ input_section_attr | input_section_pattern)
([,] + input_section_attr | , input_section_pattern))*
)]
其語(yǔ)法說(shuō)明如下。
① module_select_pattern
這是由文字文本構(gòu)成的模式。“*”通配符匹配0個(gè)或多個(gè)字符,而“?”匹配任何單個(gè)字符。匹配不區(qū)分大小寫(xiě)。
使用*.o可以匹配所有對(duì)象。使用*可以匹配所有目標(biāo)文件和庫(kù)。
當(dāng)滿(mǎn)足下列條件之一時(shí),鏈接器認(rèn)為module_selector_pattern與輸入段匹配。
· 包含輸入段的目標(biāo)文件與module_selector_pattern匹配。
· 包含輸入段的庫(kù)成員名稱(chēng)(不帶路徑名)與module_selector_pattern匹配。
· 從其中提取段的庫(kù)全名(包含路徑名)。如果名稱(chēng)包含空格,使用通配符可以簡(jiǎn)化搜索。例如,使用*libname.lib匹配C:lib dirlibname.lib。
另外,ARM鏈接器支持特殊的模塊選擇程序模式“.ANY”,允許將輸入節(jié)分配給執(zhí)行區(qū),而無(wú)需考慮其父模塊。使用.ANY以任意分配方式填充執(zhí)行區(qū)。
注意 | 最好不要依賴(lài)編譯程序生成的或ARM庫(kù)代碼使用的輸入段名。因?yàn)?,這些名稱(chēng)在每次編譯之間可以變化,例如編譯選項(xiàng)的改變或編譯器版本發(fā)生變化,都可能引起輸入段名稱(chēng)的變化。 |
② input_section_attr
輸入段屬性符定義了一個(gè)用逗號(hào)隔開(kāi)的模式類(lèi)別。該類(lèi)表中的每個(gè)模式定義了輸入段名稱(chēng)或輸入段屬性匹配方式。當(dāng)匹配模式使用輸入段名稱(chēng)時(shí),它前面必須使用符號(hào)“+”,而符號(hào)“+”前面緊接的逗號(hào)可以省略。
輸入段屬性不區(qū)分大小寫(xiě)??梢允窍铝袑傩灾唬?/p>
· RO-CODE;
· RO-DATA;
· RO,同時(shí)選擇RO-CODE和RO-DATA;
· RW-DATA;
· RW-CODE;
· RW,同時(shí)選擇RW-CODE和RW-DATA;
· ZI;
· ENTRY,包含ENTRY點(diǎn)的節(jié)。
可以識(shí)別以下同義詞:
· CODE代表RO-CODE;
· CONST代表RO-DATA;
· TEXT代表RO;
· DATA代表RW;
· BSS代表ZI。
可以識(shí)別以下偽屬性:
· FIRST;
· LAST。
存儲(chǔ)器相關(guān)文章:存儲(chǔ)器原理
評(píng)論