ARM7嵌入式系統(tǒng)中啟動程序的實現(xiàn)
啟動程序中生成的匹配表中包含地址映射,存儲頁大小(1M,64K,或4K)以及是否允許存取等信息。
例如:目標板上的16兆DRAM的物理地址區(qū)間為0xc000,0000~0xc07f,ffff和0xc100,0000~0xc17f,ffff;16兆ROM的虛擬地址區(qū)間為:0x0000,0000~0x00ff,ffff。匹配表配置如下:
0x0000,00000xc000,0000r/w
0x0010,00000xc010,0000…
0x0020,00000xc020,0000…
…………
0x0070,00000xc070,0000r/w
0x0080,00000xc100,0000…
…………
0x00f0,00000xc170,0000…
0x0100,00000x0000,0000ro
0x0110,00000x0010,0000
0x01f0,00000x00f0,0000
0x0200,00000x0200,0000inaccessable
……………
可以看到左邊是連續(xù)的虛擬地址空間,右邊是不連續(xù)的物理地址空間,而且將DRAM映射到了0地址區(qū)間。MMU通過虛擬地址和頁面表位置信息,按照轉換邏輯獲得對應物理地址,輸出到地址總線上。
應注意到的是使能MMU后,程序繼續(xù)運行,但是對于程序員來說程序計數(shù)器的指針已經(jīng)改變,指向了ROM所對應的虛擬地址。
⑵目標文件的分布裝載分析
首先創(chuàng)建一個文本文件,稱為分布裝載描述文件。它為應用程序的各部分指定裝載區(qū)間和執(zhí)行區(qū)間。
舉例如下:
FLASH0x010000000x011fffff;2MFLASH
{
FLASH0x01000000
{
boot.o(BOOT,+First)
*(+RO)
}
DRAM0x00000000
{
vector.0(VECTOR,+First)
int_handler.o(+RO)
*(+RW,+ZI)
}
}
在arm鏈接器的命令行里加入”-scovdescription-file-scf”或”-scatterdescription-file”,編譯鏈接后,將產(chǎn)生一個分布裝載文件。
鏈接器同時產(chǎn)生一組符號,給出每個分布描述文件中命名的區(qū)間的長度,裝載地址和執(zhí)行地址。由于鏈接器和C庫都沒有將代碼從它的裝載區(qū)間拷貝到執(zhí)行區(qū)間,或創(chuàng)建一個零初始化區(qū)域的功能,所以要由應用程序員利用這組符號產(chǎn)生的信息完成這項工作,這是在呼叫C程序之前必須完成的,舉例如下:
LDRr0,=|Load$$DRAM$$Base|
LDRr1,=|Image$$DRAM$$Base|
CMPr0,r1檢查裝載地址和執(zhí)行地址是否相同
BEQdo_zi_init相同,則不拷貝該區(qū)間,初始化零數(shù)據(jù)區(qū)
MOVr2,r1;不相同,將裝載區(qū)拷貝到執(zhí)行區(qū)
LDRr4,=|Image$$DRAM$$length|
ADDr2,r2,r4
BLcopy
do_zi_init
LDRr1,=|Image$$DRAM$$ZI$$Base|
MOVr2,r1
LDRr4,=|Image$$DRAM$$ZI$$length|
ADDr2,r2,r4
MOVr3,#0
BLzi_init調(diào)用零初始化子程序
結語:
本文介紹的啟動程序已經(jīng)在以CirrusLogic公司的EP7211和Ateml公司的AT91M40400開發(fā)的系統(tǒng)上運行并測試通過。今后可以在這一基礎上添加串行通信模塊和FLASH操作模塊,開發(fā)系統(tǒng)監(jiān)控程序,從而實現(xiàn)應用程序的在線升級。
評論