分散載入(scatlerloading),即工程裡的.scf檔案。在scatterfile中可以為每乙個**或資料區在裝載和執行時指定不同的儲存區域位址,scatlertoading的儲存區塊可以分成二種型別:
裝載區:當系統啟動或載入時應用程式的存放區。
執行區:系統啟動後,應用程式進行執行和資料訪問的儲存器區域,系統在實時執行時可以有乙個或多個執行塊。
映像中所有的**和資料都有乙個裝載位址和執行位址(二者可能相同也可能不同,視具體情況而定)。
my region 0x0000 0x1000
內容:塊定義的內容包括在緊接的一對花括號內,依賴於具體的系統情況。
乙個載入塊(載入時域)必須至少含有乙個執行塊(執行時域);實踐中通常有多個執行塊。
乙個執行塊必須至少含有乙個**或資料段;這些通常來自原始檔或庫函式等的目標檔案;萬用字元號*可以匹配指定屬性項中所有沒有在檔案中定義的餘下部分。
2.分散載入樣例分析: 這裡用周立功的開發板附帶例程裡的分散載入檔案做例子進行講解。
硬體配置:
內部64k ram: 0x4000 0000 - 0x4000 ffff
外部2m flash: 0x8000 0000 - 0x801f ffff
外部8m ram: 0x8100 0000 - 0x807f ffff
rom_load 0x80000000 ;載入時域描述
iram 0x40000000 ;第二個執行時域:將堆疊空間放入
;片內靜態ram中(0x40000000)
stacks_bottom +0 uninit ;
將棧底放在堆疊的後面(+0) ;
不進行初始化(uninit)。
stacks 0x40004000 uninit ;將stacks放入40004000 此處位址不能訪問;如訪問將產生預取中止和資料中止異常
startup.o (stacks)
eram 0x81000000 ;將所有rwzi(*(+rw,+zi))段放入外部ram中
* (+rw,+zi)
heap +0 uninit ;在rwzi段後放入堆底
startup.o (heap)
heap_bottom 0x81080000 uninit
startup.o (heaptop) ;堆頂:放入了外部ram中(0x81080000)
(1)樣例中,只有乙個載入塊rom_load,包含了所有的**和資料(存放在rom),起始位址為0x800000000。這個載入塊一共對應七個執行塊(rom_exec, iram,stacks_bottom, stacks,eram,heap,heap_bottom)。
(2) ro的**和資料會從rom_exec開始執行,執行位址與裝載位址相同。
(3)startup.o是startup.s的目標檔案(startup.s也在這個工程下),
vectors是在startup.s定義的段,整個句子的意思是把整個startup.s編譯生成的目標檔案(向量表)放在0x8000 0000的第乙個位置,即從vectors開始依次從rom_exec的頂部放下來。
(4)所有的rw和zi資料報含在外部ram執行塊裡,起始位址為0x81080000。
(5)rw資料是從rom_load copy 過來的,zi資料是在ram中初始化的,其位置在rw之上。
(6)heap是用來定位堆疊的底的,
堆疊底的位置在zi之上所以使用"+0",heap會從此位址增加。
(7)stacks是用來定位堆疊頂的,堆疊頂的位置在可以用來作為儲存的記憶體的頂部。stacks會從堆疊頂的位址下降。
ARM分散載入檔案
一 原理 arm的聯結器提供了一種分散載入機制,在連線時可以根據分散載入檔案 scf檔案 中指定的儲存器分配方案,將可執行映象檔案分成指定的分割槽並定位於指定的儲存器實體地址。這樣,當嵌入式系統在復位或重新上電時,在對cpu相應暫存器進行初始化後,首先執行rom儲存器的bootloader 根據連線...
ARM分散載入檔案
可以將 放入不同的儲存空間。了解分散載入檔案之前,首先需要了解code ro data rw data zi data。define num 0x2000 ro data char const flage 5 ro data char str str rw data char a zi data 下...
ARM分散載入檔案
摘要 從arm elf目標檔案主要構成出發,詳細介紹了分散載入的基本原理 分散載入檔案的語法 分散載入時聯結器生成的預定義符號及要重新實現的函式等 以定位目標外設和定義超大型結構體陣列兩項應用案例加以說明,並給出完整的工程例項和bootloader 這些都已經在實際工程中多次應用和驗證,是筆者實際工...