Arm 系統中常用的段分類說明 |
.text段是代碼段。它用來放程序代碼(code)。它通常是隻讀的。 .data段是數據段。它用來存放初始化了的(initailized)全局變量(global)和初始化了的靜態變量(static)。它是可讀可寫的。 .bss段是全局變量數據段。它用來存放未初始化的(uninitailized)全局變量(global)和未初始化的靜態變量(static)。它也是可讀可寫的。bss是英文Block Started by Symbol的縮寫。之所以把bss跟data分開來,是因爲系統會爲這些bss段的變量的初值清零。 .rodata段是常量數據段。它用來存放常量(const)。它也是隻讀的。 在ARM的集成開發環境中, 1、只讀的代碼段稱爲Code段,即上述的.text段。 2、只讀的常量數據段,被稱作RO Data段,即上述的.constdata段。 以上兩個段統稱爲RO段(Read Only),放在ROM或FLASH等非易失性器件中。 3、可讀可寫的初始化了的全局變量和靜態變量段,被稱作RW Data段(ReadWrite),即上述的.data段。 4、可讀可寫的未初始化的全局變量和靜態變量段,被稱作ZI Data段(Zero Init),即上述的.bss段。因爲這個段裏的變量要被初始化爲零,所以叫ZI段。 以上兩個段統稱爲RW段,而在運行時,它必須重新裝載到可讀可寫的RAM中。 一 可執行文件組成及內存映射 在ADS下,可執行文件有兩種,一種是.axf文件,帶有調試信息,可供AXD調試工具使用.另一種是.bin 文件,可執行的二進制代碼文件。我們重點是講描.bin文件的組成。 我們把可執行文件分爲兩種情況:分別爲存放態和運行態。 1. 存放態 存放態是指可執行文件通過fromelf產生後,在存儲介質(flash或磁盤)上的分佈. 此時可執行文件一 般由兩部分組成:分別是代碼段和數據段。代碼段又分爲可執行代碼段(.text)和只讀數據段(.rodata), 數據段又分爲初始化數據段(.data)和未初始化數據段(.bss)。可執行文件的存放態如下: +-------------+----------- | .bss | +-------------+-- 數據段 | .data | +-------------+----------- | .rodata | |_____________| 代碼段 | .text | +-------------+----------- 2. 運行態 可執行文件通過裝載過程, 搬入到RAM中運行, 這時候可執行文件就變成運行態。在ADS下對可執行代 碼各段有另一個名稱: | ... | +-------------+----------- +-------------+-- 數據段 +-------------+----------- | .rodata | |_____________| 代碼段(RO 段) | .text | +-------------+----------- | ... | 裝載前 當可執行文件裝載後, 在RAM中的分佈如下: | ... | +-------------+-- ZI段結束地址 | ZI 段 | +-------------+-- ZI段起始地址 | 保留區2 | +-------------+-- RW段結束地址 | RW 段 | +-------------+-- RW段起始地址 | 保留區1 | +-------------+-- RO段結束地址 | RO 段 | +-------------+-- RO段起始地址 | ... | 裝載後 所以裝載過程必須完成把執行文件的各個段從存儲介質上搬到RAM指定的位置。而這個裝載過程由誰來完 成呢?由我們的啓動程序來完成. 二 裝載過程 在ADS中,可以通過兩種方式來指定可執行代碼各段在RAM中的位置,一個是用armlink來指定,一種是 用scatter文件來指定.RAM區的起始地址:0x30000000. 1. armlink指定代碼段地址 我們通常的代碼,只用指定兩個段開始地址, RO段的起始地址和RW段的起始地址, ZI段緊接在RW段之 後.示例見該部分的1.1.3. 2. scatter指定代碼段地址 我們也可以通過scatter文件指定可執行文件各段的詳細地址. Scatter文件如下: MYLOADER 0x30000000 ;MYLOADER: 爲可執行文件的名稱, 可自定義 ;0x3000000: 起始地址 { RO 0x30000000 ;RO 只讀代碼段的名稱 ;0x30000000: 只讀代碼段的起始地址 { init.o (Init, +First) ; Init代碼段爲可執行文件的第一部分. * (+RO) ;所有其它的代碼段和只讀數據段放在該部分 } RW +0 ;RW: RW段的名稱 ;+0: 表示RW段緊接着RO段 { * (+RW) ;所有RW段放在該部分 } ZI +0 ;ZI: ZI段的名稱 ;+0: 表示ZI段緊接着RW段 { *(+ZI) ;所有ZI段放在該部分 } } 3. ADS產生的各代碼段宏 |Image$$RO$$Base| /* RO代碼段起始地址 */ |Image$$RO$$Limit| /* RO 代碼段結束地址 */ |Image$$RW$$Base| /* RW代碼段起始地址 */ |Image$$RW$$Limit| /* RW 代碼段結束地址 */ |Image$$ZI$$Base| /* ZI 代碼段起始地址 */ |Image$$ZI$$Limit| /* ZI 代碼段結束地址 */ 注意:在兩個$$之間的名稱, 與scatter中指定的段的名稱相同. 4. 裝載過程說明 當從NorFlash啓動時, 要把flash芯片的首地址映射到0x00000000位置, 系統啓動後, 啓動程序本身把自己從 flash中搬到RAM中運行. 搬移後的各段起始地址, 由以上宏來確定. 當從NandFlash啓動時, S3C2410會自動把前NandFlash的前4k搬到S3C2410的內部RAM中,並把內部 RAM的首地址設爲0x00000000,CPU從0x00000000開始執行. 所以, 在nandFlash的前4k程序中,必須包含從 NandFlash把BootLoader的其餘部分裝入RAM的程序. 附:TI 編譯中常用的段說明 系統常用的段定義: .cinit:包含未用const聲明的外部(external)或靜態(static)數據表 .const:包含已用const聲明的外部或靜態數據表以及字符串常量。 .text:包含所有可執行的代碼以及常量。 .bss:用於爲cinit段以及未初始化的全局和靜態變量保留空間(一般是內存空間)
來自:http://nasa1008.blog.163.com/blog/static/37423982201037112224432/ |
ARM 中常用的段分類說明
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.