ARM分散加載文件
ARM的連接器提供了一種分散加載機制,在連接時可以根據分散加載文件(.scf文件)中指定的存儲器分配方案,將可執行鏡像文件分成指定的分區并定位于指定的存儲器物理地址。這樣,當嵌入式系統在復位或重新上電時,在對CPU相應寄存器進行初始化后,首先執行ROM存儲器的Bootloader代碼,根據連接時的存儲器分配方案,將相應代碼和數據由加載地址拷貝到運行地址,這樣,定位在RAM存儲器的代碼和數據就在RAM存儲器中運行,而不再從ROM存儲器中取數據或取指令,從而大大提高了CPU的運行速率和效率。
本文引用地址:http://www.104case.com/article/201611/317889.htm(二)結構
Scatlertoading的存儲區塊可以分成二種類型:
裝載區:當系統啟動或加載時應用程序的存放區。
執行區:系統啟動后,應用程序進行執行和數據訪問的存儲器區域,系統在實時運行時可以有一個或多個執行塊。
(三)分散加載時連接器生成的預定義符號
在編譯連接時如果指定了分散加載文件(.scf文件),在連接后會自動生成如下變量:
(四)具體例子說明
;ROM_LOAD為加載區的名稱,其后面的0x00000000表示加載區的起始地址(存放程序代碼的起始地址)
ROM_LOAD 0x0
{
;ROM_EXEC描述了執行區的地址,放在第一塊位置定義
ROM_EXEC 0x00000000
{
;從起始地址開始放置向量表(即Startup.o(vectors, +First),其中Startup.o為Startup.s的目標文件)
;+First表示Vector段放在最前面
;AREAvectors, CODE, READONLY
Startup.o (vectors, +First)
;接著放置其它代碼(即* (+RO)),* 是通配符,類似WINDOW下搜索用的通配符
* (+RO)
}
;變量區IRAM的起始地址為0x40000000
IRAM 0x40000000
{
;放置Startup.o (MyStacks)
Startup.o (MyStacks)
}
;+0表示接著上一段,UNINIT表示不初始化
STACKS_BOTTOM +0 UNINIT
{
;放置AREA StackBottom, DATA, NOINIT
Startup.o (StackBottom)
}
;接著從0x40004000開始,放置AREAStacks, DATA, NOINIT,UNINIT表示不初始化
STACKS 0x40004000 UNINIT
{
Startup.o (Stacks)
}
;外部RAM從0x80000000開始為變量區
;如果片外RAM起始地址不為0x8000 0000,則需要修改mem_.scf文件
ERAM 0x80000000
{
* (+RW,+ZI)
}
;+0表示接著上一段,UNINIT表示不初始化
HEAP +0 UNINIT
{
;放置堆底,AREA Heap, DATA, NOINIT
Startup.o (Heap)
}
;接著在外部0x80080000放置堆頂
;這個地址是片外RAM 的結束地址,根據實際情況修改
HEAP_BOTTOM 0x80080000 UNINIT
{
Startup.o (HeapTop)
}
}
以上分散文件的可引用的段名
|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
評論