基于S3C44B0X的Bootloader設(shè)計與實現(xiàn)
BootLoader的stage1通常包括以下步驟(以執(zhí)行的先后順序):
1) 硬件設(shè)備初始化。
2) 為加載BootLoader的stage2準備RAM空間。
3) 拷貝BootLoader的stage2到RAM空間
4) 設(shè)置堆棧
5) 跳轉(zhuǎn)到stage2的C程序入口點
BootLoader的stage2通常包括以下步驟(以執(zhí)行的先后順序):
1) 初始化本階段要使用到的硬件設(shè)備
2) 檢測系統(tǒng)內(nèi)存映射
3) 將內(nèi)核映像和根文件系統(tǒng)映像從Flash讀到RAM
4) 為內(nèi)核設(shè)置啟動參數(shù)
5) 調(diào)用內(nèi)核
4.Bootloader的代碼實現(xiàn)
Bootloader的Stage1初始化流程圖如圖3所示. Stage1部分主要內(nèi)容及其代碼實現(xiàn):
/*中斷向量表用于處理異常情況,當發(fā)生異常情況時,首先要保存當前程序的返回地址和CPSR寄存器的值,然后進入到相應的異常向量地址。一般來說,在異常向量地址處放置無條件跳轉(zhuǎn)指令,使程序進入相應的異常處理過程。*/
_ENTRY
B ResetHandler ;reset vector
B UndefinedHandler ;Undefined instruction
B SWIHandler ;SWI
B PrefetchHandler ;Prefetch abort
B AbortHandler ;Data abort
B. ;Address exception
B IRQHandler ;IRQ
B FIQHandler ;FIQ
……
/*復位入口,切換到超級模式并禁止中斷。在整個Boot Loader的初始化過程中我們都不必響應中斷,因此首先禁止系統(tǒng)的中斷。*/
MRS a1,CPSR
BIC a1,a1,#MODE_MASK
ORR a1,a1,#SUP_MODE
ORR a1,a1,#LOCKOUT ;關(guān)閉IRQ、FIQ中斷
MSR CPSR_cxsf,a1
LDR r0,=INTCON ;設(shè)置中斷模式,非向量中斷模式
LDR r1,=0x07 ;IRQ、FIQ中斷禁止
STR r1,[r0]
LDR r0,=INTMSK ;關(guān)閉所有中斷
LDR r1,=0x07ffffff
STR r1,[r0]
LDR r0,=SYSCFG ;使能回寫buffer和Cache
LDR r1,=0xE
STR r1,[r0]
……
/*當必要的硬件初始化設(shè)置完畢后,接下來為核心代碼貯備RAM空間,包括RO、RW、ZI這3個段設(shè)置相應的內(nèi)存映射向量,Bootloader先將ZI段請零,然后將RO段復制到RW段中。由于在我們采用的S3C44B0X微處理器里對于FLASH和RAM地址空間是使用的統(tǒng)一編址的,因此我們可以直接使用一個簡單循環(huán)來完成拷貝。*/
move_data :
LDR a1,=Image_RW_Base ;RW段運行時的起始地址
LDR a2,=Image_RO_Limit ;RO段運行時的存儲區(qū)域界限
LDR a3,=Image_ZI_Base ;ZI段運行時的起始地址
CMP a1,a3
BEQ goto_main ;跳轉(zhuǎn)到C入口函數(shù)
move_loop : ;將RO段復制到RW段
LDR a4,[a2],#4
STR a4,[a1],#4
CMP a1,a3
BNE move_loop
存儲器相關(guān)文章:存儲器原理
評論