ARM空間分段(lst文件夾下map文件)
局部變量占用棧(stack)空間。
程序中動態(tài)申請的如malloc()和new函數(shù)申請的內存空間占用堆(heap)空間。
|ImageRO
Base|表示RO輸出段運行時起始地址,也可以說是程序代碼存放的起始地址,由-ro-base這個參數(shù)指定;
|ImageROLimit|
表示RO輸出段運行時存儲區(qū)域界限,其值可通過|ImageROBase|+Codesizes+RO Data sizes+4計算得出;
|ImageRWBase|
表示RW輸出段運行時起始地址,記得是運行時的地址,而不一定是加載時的存放地址,因為RW輸出段在加載時可能是在ROM中并緊跟著RO輸出段存放的,當程序運行時才移動(在有些書中說是移動,個人覺得應該只是復制,希望大家能幫我解釋一下,謝謝!)到RAM起始地址為|ImageRWBase|的區(qū)域,由-rw-base這個參數(shù)指定;未指定的話,默認緊跟RO輸出段,那么|ImageRWBase|=|ImageROLimit|;
|ImageRWLimit|
表示RW輸出段運行時存儲區(qū)域界限,其值可通過|ImageRWBase|+RW Data sizes+4計算得出;
|ImageZIBase|
表示ZI輸出段運行時起始地址,它是運行時在RAM中生成的,緊跟著RW輸出段存放,其值和|ImageRWLimit|一樣;
|ImageZILimit|
表示ZI輸出段運行時存儲區(qū)域界限,其值可通過|ImageZIBase|+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
注:ImageZILimit變量為零初始化段(ZI段)的末地址。未使用分散加載時,堆默認就定位在ZI段的末地址,而棧通常位于RAM的頂端
(2)使用兩個存儲區(qū)
匯編語言如下:
這種方式定義的堆棧和堆分別采用兩個不同存儲區(qū)。堆棧采用向下增長,從地址Ox40000到地址Ox20000;堆采用向上增長,從地址0x28000000到地址0x28080000,如圖4所示。
評論