2009年7月2日 星期四

使用linker(ld)

使用Linker Scripts時要有所謂VMA(virtual memory address)與LMA(load memory address)的觀念.
VMA指的就是系統上的RAM或Local memory.
LMA指的就是系統是的ROM或是Flash.
當編譯器把程式編譯成燒錄檔(.BIN)後,會將程式燒錄至ROM或是Flash,但是系統執行時,會將程式載到RAM或是Local memory.

範例1:
SECTIONS
{
. = 0x10000;
.text : { *(.text) }
. = 0x8000000;
.data : { *(.data) }
.bss : { *(.bss) }
}

程式放在0x10000的位址.
資料放在0x8000000的位址.

SECTIONS :描述輸出文件的記憶體佈局.
. :位址計數器,SECTIONS開始第一個位址計數器值為0.
* : 所有的輸入,例如*(.data),指的是.data所有的輸入.
.text :程式段,內容通常不會改變,可以直接在ROM裡執行,如果有執行速度的需求,也可放在RAM執行.
.data : 全域變數(global)有設定初始值放置的區段,因為變數值會被改變,程式執行時會放置RAM裡執行,例如 int i = 10;.
.bss(block started by symbol): 全域變數(global)沒有設定初始值放置的區段,因為變數沒有初始值,系統執行時,會定址到RAM,例如 int i;.
/* */ :註解.

沒有留言:

張貼留言