新聞中心

EEPW首頁 > 嵌入式系統(tǒng) > 設計應用 > ARM空間分段(lst文件夾下map文件)

ARM空間分段(lst文件夾下map文件)

作者: 時間:2016-11-09 來源:網(wǎng)絡 收藏
對于ARM,堆是向上生長的,棧是向下生長的。


局部變量占用棧(stack)空間。

程序中動態(tài)申請的如malloc()和new函數(shù)申請的內存空間占用堆(heap)空間。

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

|ImageRO

Base|
表示RO輸出段運行時起始地址,也可以說是程序代碼存放的起始地址,由-ro-base這個參數(shù)指定;
|ImageRO
Limit|
表示RO輸出段運行時存儲區(qū)域界限,其值可通過|ImageRO
Base|+Codesizes+RO Data sizes+4計算得出;
|ImageRW
Base|
表示RW輸出段運行時起始地址,記得是運行時的地址,而不一定是加載時的存放地址,因為RW輸出段在加載時可能是在ROM中并緊跟著RO輸出段存放的,當程序運行時才移動(在有些書中說是移動,個人覺得應該只是復制,希望大家能幫我解釋一下,謝謝!)到RAM起始地址為|ImageRW
Base|的區(qū)域,由-rw-base這個參數(shù)指定;未指定的話,默認緊跟RO輸出段,那么|ImageRW
Base|=|ImageRO
Limit|;
|ImageRW
Limit|
表示RW輸出段運行時存儲區(qū)域界限,其值可通過|ImageRW
Base|+RW Data sizes+4計算得出;
|ImageZI
Base|
表示ZI輸出段運行時起始地址,它是運行時在RAM中生成的,緊跟著RW輸出段存放,其值和|ImageRW
Limit|一樣;
|ImageZI
Limit|
表示ZI輸出段運行時存儲區(qū)域界限,其值可通過|ImageZI
Base|+ZI Data sizes+4計算得出。

CODE 是 RO-CODE同義詞,也是.text同義詞
CONST是RO-DATA同義詞,也是.constdata同義詞
DATA是RW-DATA同義詞,也是.data同義詞
ZI是.bss的同義詞

Total RO Size (Code + RO Data) 12216 ( 11.93kB)
Total RW Size (RW Data + ZI Data) 292 ( 0.29kB)
Total ROM Size (Code + RO Data + RW Data) 12412 ( 12.12kB)

應用程序的堆棧(stack)和堆(heap)是在C庫函數(shù)初始化過程中建立起來的,在ADSl.2或更新版本中,在缺省狀態(tài)下C庫函數(shù)初始化代碼會將連接器生成的符號ImageZI

Limit地址作為堆的基地址。在分散加載時,連接器會將用戶的__user_initidl_stackheap()函數(shù)代替C庫函數(shù)默認的堆棧和堆初始化函數(shù),并將其連接到用戶的鏡像文件中,用戶可通過重新實現(xiàn)__user_initial_stackheap()函數(shù)來改變堆棧和堆的位置,從而適合自己的目標硬件。

__user_initial_stackheap()可以用C或匯編語言來實現(xiàn)。它必須返回如下參數(shù):

r0—堆基地址;

r1—堆?;刂?;

r2—堆長度限制值(需要的話);

r3—堆棧長度限制值(需要的話)。
當用戶使用分散加載功能的時候,必須重新實現(xiàn)一user_initial_staacklaeap(),否則連接器會報錯:
Error:L6218E:Undefined symbol ImagerZI

一Limit(referred from sys_stackheap.o)。
注:ImageZI
Limit變量為零初始化段(ZI段)的末地址。未使用分散加載時,堆默認就定位在ZI段的末地址,而棧通常位于RAM的頂端

(2)使用兩個存儲區(qū)
匯編語言如下:

這種方式定義的堆棧和堆分別采用兩個不同存儲區(qū)。堆棧采用向下增長,從地址Ox40000到地址Ox20000;堆采用向上增長,從地址0x28000000到地址0x28080000,如圖4所示。




關鍵詞: ARM空間分段map文

評論


技術專區(qū)

關閉