ARM 中常用的段分類說明

 

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下對可執行代

碼各段有另一個名稱:

| ... |

+-------------+-----------

| .bss | ZI 段

+-------------+-- 數據段

| .data | RW 段

+-------------+-----------

| .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/

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章