**
arm體系結構中,系統上電或復位後,處理器將從位址0x0處取第一條指令,因此,上 電的時候,位址0x0處必須是非易失性的rom或flash。但是,為了加快中斷響應速度,方便更改中斷向量表,有時需要把中斷向量表複製到ram中去, 然後把ram重新對映到位址0x0處,這就用到了位址重對映機制。因為位址重對映是在程式執行過程中進行的,必須考慮程式執行流程的連續性。
引導引導程式:
乙個嵌入式系統的軟體通常可以分為3個部分:引導引導程式, 嵌入式作業系統, 使用者應用程式. 引導引導程式是系統加電後執行的第一段軟體**. 簡單地說, 就是在作業系統核心執行之前執行的一段小程式(在嵌入式系統中通常叫做bootloader). 通過這段小程式, 可以初始化硬體裝置、建立記憶體空間的對映圖, 從而將系統的軟硬體環境配置到乙個合適的狀態,以便為最終呼叫作業系統核心設定適當的環境. 而在嵌入式系統中, 通常並沒有像pc機中bios那樣的韌體程式(有的嵌入式cpu也會內嵌一段短小的啟動程式), 因此整個系統的載入啟動任務就完全由bootloader來完成. 由於每個使用者對嵌入式cpu的應用千差萬別, 每個使用者對系統的啟動有不同的要求, 所以bootloader程式一般都由使用者根據自己的實際要求編寫.
arm處理器的位址重對映機制可分為三種情況:1、處理器內部有專門的暫存器完成重對映(remap),只需將remap暫存器相應位置「1」,由硬體邏 輯來完成位址的重新對映。2、沒有專門的remap控制暫存器,需要重新改寫用於控制儲存器起始位址的塊(bank)暫存器,來實現remap。3、沒有 remap暫存器,而bank暫存器的起始位址固定,這就需要mmu實現位址重對映。另外,有一些arm處理器沒有位址重對映機制。
(第一種情況)由於處理器位址重對映機制不同,其具體實現方式也是不同 的。at91m55800a採用乙個專用暫存器ebi_rcr(重對映控制暫存器),通過向ebi_rcr的rcb暫存器的第0位寫「1」實現位址重映 射。系統復位瞬間,系統將flash位址對映在0x0的位置,而將內部sram對映在0x00300000的位置。啟動**需將flash中的中斷向量拷 貝到內部sram中,然後,執行重對映命令,把內部sram的位址重新對映到0x0的位置,而將flash的位址對映到其他位置,如 0x01000000(由ncs0片選,配置ebi—csr0暫存器)的位置。這樣便可以在內部sram中0x0開始的位置修改中斷向量。同時,為了保證 程式執行流程的連續性,必須調整pc指標,即調整到程式真正被連線的地方(0x01000000)去。這時,程式仍在flash中執行。如下所示:
(第二種情況)三星s3c4510b最大可定址空間為64mb,它把64mb的位址空間分為10個塊,每個塊的起始位址和大小都可以通過暫存器來設定。上 電時預設flash對映到位址空間為0x0000,0000~0x0200,0000的位置,這樣,程式從flash中的啟動**開始執行。在啟動** 中,把sdram對映到位址空間的其他位置,如0x0040,0000~(0x0140,0000-1)。接著將flash中從0x0開始的程式一一對應 地複製到sdram中從0x0040,0000開始的位址空間,然後,把sdram對映到從0x0開始的位址空間,flash對映到其他位置,如從 0x0100,0000開始的位址空間,至此,完成了位址重對映。而它的pc指標不需要調整,這時的pc指標已經指向sdram中了。
開始啟動時, 存有啟動**的flashrom被對映到0x0000000位址, 系統從此開始執行. 但在實際應用中, 為提高系統的實時性, 加快**的執行速度, 系統啟動後程式往往要被搬移到訪問速度要比flashrom快得多的sdram中, 以此大幅提高系統的實時效能.又由於s3c4510b晶元中的異常中斷入口位址被固定在0x0000000開始的8個字(每個字包括4個位元組)中, 因而系統只能將儲存器進行位址重對映( remap),把sdram對映到0x000000位址處, 把flashrom的位址對映到系統高階位址.s3c4510b硬體系統有4mb的flashrom, 使用16位資料匯流排; 16mb的sdram, 使用32位資料匯流排. 如圖2所示, remap前系統位址0x0000000~0x03fffff 分配給 flash rom, 0x0400000 ~0x13fffff分配給sdram; remap後0x0000000~0x0ffffff分配給sdram, 0x1000000~ 0x13fffff分配給flashrom。
remap後, sdram被對映到0x0000000~0x0ffffff的位址空間, 而flashrom則被對映到高於0x0ffffff的位址上. 為保證remap後程式能夠正常執行, 整個過程必須確同時還將產生這3種段的起始和終止定位資訊:
image $$ro$$base、image$$ro $$limit、image $$rw$ $base、image$rw$limit、image$zi$base和image$$zi$$-limi.t 使用這些定位資訊,
將flashrom中的**和資料搬移到sdram中,
源程式如下:
start_flashdcd |image$$ro$ $base|在實際應用系統中, 由於flashrom儲存器相對而言比較小速度慢且**高, 為了節約成本提高執行速度,end_flashdcd |image$$ro$ $limit|
start_bss dcd |image$$rw$$base|
end_bss dcd |image$$rw$$limit|start_zero dcd |image$$zi$$base|
end_zero dcd |image$$zi$$limit|
;/ /複製flashrom中的**到sdram中/ /;
ldrr0, = start_flash
ldrr1, = end_flash
ldrr2, = start_bss
ldrr3, = end_bss
subr1, r1, r0
subr3, r3, r2
addr1, r1, r3
ldrr2, = 0x400000
;/ /remap前sdram起始位址
copldrr3, [ r0], #4
strr3, [ r2], #
4subsr1, r1, #
4bnecop
ldrr0, = end_flash
ldrr1, = start_bss
ldrr3, = start_zero
cmpr0, r1
beqloop1
;/ /複製rw段到sdram/ /
loopcmp r1, r3
ldrccr2, [ r0], #
4strccr2, [ r1], #
4bccloop
;/ /複製zi段並清0/ /
loop1ldrr1, =end_zero
movr2, #
0loop2cmp r3, r1
;strccr2, [ r3], #4
bccloop2
通常將會把應用程式和在儲存器中的資料先壓縮然後再寫入flashrom中同時將解壓縮程式也寫進去. 當系統上電啟動後,
在搬移程式和資料時解壓程式先將被壓縮過的程式和資料解壓後再搬到sdram的適當位置中. 由於壓縮解壓程式比較複雜不在這裡討論。
(第三種情況)三星s3c44b0x的位址空間分成8個塊,bank0~bank6的起始位址固定,大小可變。bank7雖起始位址可變,但只是為了保證
與bank6位址連續,因為bank6、bank7主要用於dram。s3c44b0x沒有提供位址重對映機制。三星s3c2410x把1gb的位址空間
分為8個塊(bank0~
bank7),它們的起始位址固定,大小可變。s3c2410x沒有進行位址重對映的控制暫存器,只有記憶體管理單元(mmu)。mmu把實體地址空間對映
到虛擬位址空間,通過這種方式可以實現位址重對映。
(第四種情況)intel公司strongram sa-1110和xscalepxa255微處理器儲存區域分成若干塊,每個塊的起始位址固定。它們都沒有位址重對映機制,但可採用儲存器管理單元來完成位址映像的重對映。
ARM重對映機制與初始化
詳細講解,很多地方都有,我簡單總結下 1.重對映針對的是什麼物件?主要針對的是中斷向量表。系統上電或復位後,處理器將從位址0x0處取第一條指令,因此,上電的時候,位址0x0處必須是非易失性的rom或flash。為什麼要重對映?因為系統復位第一件事就是找到中斷向量表,然後通過向量表的跳轉指令去找初始化...
ARM的儲存器對映與儲存器重對映機制
arm的儲存器對映與儲存器重對映機制 今天終於明白了arm的儲存器對映與儲存器重對映機制,我覺得這一切都是為了中斷向量得到有效的執行啊。下面可以進一步了學習啦!先前在課上在聽老師講arm的儲存器對映與儲存器重對映時,聽明白了arm的儲存器對映是怎麼個回事!1.儲存器對映 處理器產生的位址按其某種規則...
ARM位址對映
重對映之後,一般原來的位址依然有效。也就是說,可能兩個位址,對應乙個儲存單元。arm晶元的位址重對映 對映就是一一對應的意思。重對映就是重新分配這種一一對應的關係。我們可以把儲存器看成乙個具有輸出和輸入口的黑盒子,如下圖所示,輸入量是位址,輸出的是對應位址上儲存的資料。當然這個黑盒子是由很複雜的半導...