地址重映射在ARM系統(tǒng)中的實現(xiàn)
2.2 系統(tǒng)啟動過程及Remap實現(xiàn)
系統(tǒng)的地址重映射應該在系統(tǒng)的啟動中完成,以下是S3C4510B的Remap啟動過程。
①系統(tǒng)特殊寄存器的設置。主要是配置如上所述的用于實現(xiàn)地址空間和芯片內外存儲介質映射的寄存器,在本系統(tǒng)中配置如下:
SYSCFG=0x87ffff90
EXTDBWTH=0x3001
ROMCON0=0x01000060
ROMCON1=0x13044060
DRAMCON0=0x11004060
②初始化系統(tǒng)堆棧。在ARM7的體系結構中共有七種工作模式,不同的模式有不販堆棧指針,互不干擾。各模式對應于不販異常中斷,至于哪些模式的堆棧需要初始化取決于用戶使用了哪些中斷,以及系統(tǒng)需要處理些異常類型。一般來說,管理者(SVC)堆棧必須設置,如果使用了IRQ中斷,則IRQ堆棧也必須設置。有一點需要注意的是,為保證Remap后程序運行正常,所有堆棧應設置在RAM的高端地址中。
③初始化I/O口、UART、定時器、中斷控制器以及系統(tǒng)中所用到的其它資源。在初始化異常向量表或修改異常向量表中的入口地址前,要關掉所有中斷。
⑤程序代碼及數(shù)據的搬移。Remap后,RAM被映射到0x0000的地址空間,ROM則被移到高端地址上。為保證Remap后程序能夠瞠運行,ROM中的代碼和數(shù)據必須地址不變地被移到RAM中。這是Remap成功的關鍵。兩種途徑可以實現(xiàn)搬移。 一種是不管實際的代碼空間有多大,直接將ROM地址空間整個搬移到RAM中。當然,這種方法并不適合在真正的啟動代碼中使用,但在做初步的Remap測試時,可以用來檢驗堆棧及異常中斷的設置是否合理。 另一種方法較復雜,它使用了SDT鏈接器ARMLink產生的定位信息,僅把RO風吹草動的有效代碼和數(shù)據段到RAM中。ARMLink將編譯后的程序鏈接成ELF文件。映像文件內部共有三種輸出段:RO段、RW段和ZI段。這三種輸出段分別包含了只讀代碼及包含在代碼段中的少量數(shù)據、可讀寫的數(shù)據、初始化為0的數(shù)據,ARMLink同時還產生了這三種輸出段的起始和終止定位信息:Image$$RO$$Base、Image$$RO$$Limit、Image$$RW$$Base、Image$$Limit、Image$$Linit和Image$$ZI$$Limit。可以在程序中使用這些定位信息。將ROM中的代碼和數(shù)據搬移到RAM中,其實現(xiàn)代碼如下: 數(shù)據定義: BaseOfROM DCD Image$$RO$$Base TopOfROM DCD Image$$RO$$Limit BaseOfBSS DCD Image$$RW$$Base BaseOfZero DCD Image$$ZI$$Base EndOfBSS DCD Image$$ZI$$Limit 源程序: ;將ROM中的程序搬移到RAM中,重映射后的地址不變 adr r0,ResetEntry ;ROM中程序起始地址 mov r3,#(RamBaseAddr16) ;RamBaseAddr=0x100 Idr r1,BaseOfROM Idr r2,TopOfROM Add r1,r1,r3 Add r2,r2,r3 0 Idmia r0!,{r4-r11} Stmia r1!,{r4-r11} Cmp r1,r2 Bcc%B0 ;將RW段中預初始化的變量搬移到RAM中 sub r1,r1,r2 sub r0,r0,r1 ;將r0指向RO段的結束,即RW段的開始 ldr r1,BaseOfBSS Idr r2,BaseOfZero Add r1,r1,3 Add r2,r2,r3 1 ;基于局部標號的相對跳轉,PC+偏移地址,產生與位置無關的代碼 cmp r1,r2 ldrcc r4,[r0],#4 strcc r4,[r1],#4 bcc %B1
④異常向量表的初始化。將民常中煌怛處理程序的入口地址寫入RAM中相應的異常向量。必須保證的是,異常向量表絕對不會被從ROM搬移到RAM中的代碼和數(shù)據所覆蓋,為此,異常向量表一般被定義在RAM中的高端地址中。
評論