ARM分散載入檔案

2021-06-21 15:06:36 字數 1967 閱讀 7116

(一)原理

arm的聯結器提供了一種分散載入機制,在連線時可以根據分散載入檔案(.scf檔案)中指定的儲存器分配方案,將可執行映象檔案分成指定的分割槽並定位於指定的儲存器實體地址。這樣,當嵌入式系統在復位或重新上電時,在對cpu相應暫存器進行初始化後,首先執行rom儲存器的bootloader**,根據連線時的儲存器分配方案,將相應**和資料由載入位址拷貝到執行位址,這樣,定位在ram儲存器的**和資料就在ram儲存器中執行,而不再從rom儲存器中取資料或取指令,從而大大提高了cpu的執行速率和效率。

(二)結構

scatlertoading的儲存區塊可以分成二種型別:

裝載區:當系統啟動或載入時應用程式的存放區。 

執行區:系統啟動後,應用程式進行執行和資料訪問的儲存器區域,系統在實時執行時可以有乙個或多個執行塊。

(三)分散載入時聯結器生成的預定義符號

在編譯連線時如果

指定了分散載入檔案(.scf檔案),在連線後會

自動生成

如下變數:

(四)具體例子說明

;rom_load 

為載入區的名稱,其後面的

0x00000000 

表示載入區的起始位址(存放程式**的起始位址)

rom_load0x0

;變數區

iram 

的起始位址為

0x40000000

iram 0x40000000;+0

表示接著上一段,

uninit 表示不初始化

stacks_bottom +0 uninit       

;接著從

0x40004000 

開始,放置

area    stacks, data, noinit

,uninit 

表示不初始化

stacks 0x40004000 uninit

;外部ram

從0x80000000

開始為變數區

;如果片外ram起始位址不為0x8000 0000,則需要修改mem_.scf檔案

eram 0x80000000

;+0表示接著上一段,

uninit 

表示不初始化

heap +0 uninit

;接著在外部

0x80080000 

放置堆頂

;這個位址是片外ram 的結束位址,根據實際情況修改

heap_bottom 0x80080000 uninit

}以上分散檔案的可引用的段名

|image$$rom_load$$limit| 

|image$$rom_exec$$limit| 

。。。。。。。。。。。。。。。。

;重定向__user_initial_stackheap 函式

;分配新的bottom_of_heap位址等,r0-r3是函式必須的返回值,返回bottom_of_heap的值

;通過分散載入描述檔案,重定向其位置

,bottom_of_heap等已經在startup.s中定義為data型別

__user_initial_stackheap    

ldr   r0,=bottom_of_heap

;    ldr   r1,=stackusr

ldr   r2,=top_of_heap

ldr   r3,=bottom_of_stacks

mov   pc,lr

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 這些都已經在實際工程中多次應用和驗證,是筆者實際工...

關於分散載入檔案

分散載入 scatlerloading 即工程裡的.scf檔案。在scatterfile中可以為每乙個 或資料區在裝載和執行時指定不同的儲存區域位址,scatlertoading的儲存區塊可以分成二種型別 裝載區 當系統啟動或載入時應用程式的存放區。執行區 系統啟動後,應用程式進行執行和資料訪問的儲...