ARM分散加載文件
ARM的連接器提供了一種分散加載機(jī)制,在連接時(shí)可以根據(jù)分散加載文件(.scf文件)中指定的存儲(chǔ)器分配方案,將可執(zhí)行鏡像文件分成指定的分區(qū)并定位于指定的存儲(chǔ)器物理地址。這樣,當(dāng)嵌入式系統(tǒng)在復(fù)位或重新上電時(shí),在對(duì)CPU相應(yīng)寄存器進(jìn)行初始化后,首先執(zhí)行ROM存儲(chǔ)器的Bootloader代碼,根據(jù)連接時(shí)的存儲(chǔ)器分配方案,將相應(yīng)代碼和數(shù)據(jù)由加載地址拷貝到運(yùn)行地址,這樣,定位在RAM存儲(chǔ)器的代碼和數(shù)據(jù)就在RAM存儲(chǔ)器中運(yùn)行,而不再?gòu)腞OM存儲(chǔ)器中取數(shù)據(jù)或取指令,從而大大提高了CPU的運(yùn)行速率和效率。
本文引用地址:http://cafeforensic.com/article/201611/317889.htm(二)結(jié)構(gòu)
Scatlertoading的存儲(chǔ)區(qū)塊可以分成二種類(lèi)型:
裝載區(qū):當(dāng)系統(tǒng)啟動(dòng)或加載時(shí)應(yīng)用程序的存放區(qū)。
執(zhí)行區(qū):系統(tǒng)啟動(dòng)后,應(yīng)用程序進(jìn)行執(zhí)行和數(shù)據(jù)訪(fǎng)問(wèn)的存儲(chǔ)器區(qū)域,系統(tǒng)在實(shí)時(shí)運(yùn)行時(shí)可以有一個(gè)或多個(gè)執(zhí)行塊。
(三)分散加載時(shí)連接器生成的預(yù)定義符號(hào)
在編譯連接時(shí)如果指定了分散加載文件(.scf文件),在連接后會(huì)自動(dòng)生成如下變量:
(四)具體例子說(shuō)明
;ROM_LOAD為加載區(qū)的名稱(chēng),其后面的0x00000000表示加載區(qū)的起始地址(存放程序代碼的起始地址)
ROM_LOAD 0x0
{
;ROM_EXEC描述了執(zhí)行區(qū)的地址,放在第一塊位置定義
ROM_EXEC 0x00000000
{
;從起始地址開(kāi)始放置向量表(即Startup.o(vectors, +First),其中Startup.o為Startup.s的目標(biāo)文件)
;+First表示Vector段放在最前面
;AREAvectors, CODE, READONLY
Startup.o (vectors, +First)
;接著放置其它代碼(即* (+RO)),* 是通配符,類(lèi)似WINDOW下搜索用的通配符
* (+RO)
}
;變量區(qū)IRAM的起始地址為0x40000000
IRAM 0x40000000
{
;放置Startup.o (MyStacks)
Startup.o (MyStacks)
}
;+0表示接著上一段,UNINIT表示不初始化
STACKS_BOTTOM +0 UNINIT
{
;放置AREA StackBottom, DATA, NOINIT
Startup.o (StackBottom)
}
;接著從0x40004000開(kāi)始,放置AREAStacks, DATA, NOINIT,UNINIT表示不初始化
STACKS 0x40004000 UNINIT
{
Startup.o (Stacks)
}
;外部RAM從0x80000000開(kāi)始為變量區(qū)
;如果片外RAM起始地址不為0x8000 0000,則需要修改mem_.scf文件
ERAM 0x80000000
{
* (+RW,+ZI)
}
;+0表示接著上一段,UNINIT表示不初始化
HEAP +0 UNINIT
{
;放置堆底,AREA Heap, DATA, NOINIT
Startup.o (Heap)
}
;接著在外部0x80080000放置堆頂
;這個(gè)地址是片外RAM 的結(jié)束地址,根據(jù)實(shí)際情況修改
HEAP_BOTTOM 0x80080000 UNINIT
{
Startup.o (HeapTop)
}
}
以上分散文件的可引用的段名
|Image$$ROM_LOAD $$Limit|
|Image$$ROM_EXEC $$Limit|
。。。。。。。。。。。。。。。。
;重定向__user_initial_stackheap 函數(shù)
;分配新的bottom_of_heap地址等,R0-R3是函數(shù)必須的返回值,返回bottom_of_heap的值
;通過(guò)分散加載描述文件,重定向其位置,bottom_of_heap等已經(jīng)在Startup.s中定義為DATA類(lèi)型
__user_initial_stackheap
LDR r0,=bottom_of_heap
; LDR r1,=StackUsr
LDR r2,=top_of_heap
LDR r3,=bottom_of_Stacks
MOV pc,lr
評(píng)論