對於s3c2440而言,啟動的方式有兩種,一是nor flash方式啟動,二是nand flash方式啟動。
nor flash的位址範圍如下0x0000.0000—0x0800.0000 (2m nor flash)
片內的bootsram位址被置為
0x4000.0000—0x4000.dfff (4k bootsram)
由於可以在nor flash直接執行**,因此bootsram被對映到別的位址上去,可作為其他用途。
程式映像直接存放到nor flash裡面,中斷向量表存放在0x0000.0000開始的8×4大小的空間中。
中斷產生時,pc被置為相對應的向量位址。如上電或者按reset鍵時,pc直接置為0x00,從nor flash的0x00處開始執行。
此時,片內的bootsram位址被置為0x0000.0000—0x0800.0000 (4k bootsram)
nand flash位址接nfce
由於nand flash中不能執行**,因此必須複製到記憶體之中再執行。
程式映像存放在nand flash中,中斷向量表位置在程式映像的最前面。由於nand flash不能執行**,系統上電或者reset的時候,內建的nand flash 將訪問控制介面,並將中斷向量表和引導**自動載入到內部sram(此時該sram 定位於起始位址空間0x00000000,容量為4kb),並且置pc值為0x00執行程式(這一切是有晶元內部的硬體邏輯完成的)。之後,sram 中的引導程式將作業系統映象載入到sdram 中,作業系統就能夠在sdram 中執行。啟動完畢,4kb 的啟動sram 就可以用於其他用途。
arm中的異常與中斷總共有7種按響應優先順序從高到低
按中斷向量表順序
復位復位
資料中止
未定義指令中斷
fiqswi
irq預取指令中止
預取指令中止
資料中止異常
未定義指令、swi
irqfiq
arm要求中斷向量表必須放置在從0位址開始,連續8×4位元組的空間內(arm720t和arm9、arm10也支援從0xffff0000開始的高位址向量表),各異常和中斷向量在向量表中的位置如下
位址中斷
0x00
reset
0x04
undef
0x08
swi0x0c
prefetch abort
0x10
data abort
0x14
(reserved)
0x18
irq0x2c
fiq當中斷產生時arm處理器強制把pc指標置為中斷向量表中相對應的向量位址。因為每個中斷向量在向量表中只有乙個位元組的儲存空間,只能存放一條指令,所以通常存放跳轉指令,使程式跳轉到儲存器的其他地方,再執行中斷處理。
中斷向量表的實現程式通常如下
area boot,code,readonly
entry
b reset_handler ; reset_handler is a label
b undef_handler
b swi_handler
b preabort_handler
b dataabort_handler
b ;for reserved interrupt, stop here
b irq_handler
b fiq_handler
其中的關鍵字entry是指定編譯器保留這段**,因為編譯器可能會認為這段**是冗餘**,將其優化。鏈結的時候要確保這段**被連線到0位址處,並且作為整個程式的入口點(entry並非總是用來設定程式的入口點的,所以通常需要在鏈結選項裡面顯式的設定程式入口點)。
中斷向量表
中斷向量表 中斷源的識別標誌,可用來形成相應的中斷服務程式的入口位址或存放中斷服務程式的首位址 稱為中斷向量。在pc at中由硬體產生的中斷標識碼被稱為中斷型別號 當然,中斷型別號還有其他的產生方法,如指令中直接給出 cpu自動形成等 即在中斷響應期間 8259a 產生的是當前請求中斷的最高優先順序...
中斷向量表
關於中斷向量的幾點注釋 1.系統引導時,中斷向量表放在記憶體何處?系統剛引導時,記憶體0x00000到0x0003ff共1kb的空間用於存放中斷向量表。每個中斷向量占用4個位元組,共可儲存256個中斷向量。2.系統引導時,處在實模式下,只可定址1mb,為什麼要用4個位元組來定址中斷呢處理程式?剛看到...
中斷向量錶小計
1.系統引導時,中斷向量表放在記憶體何處?系統剛引導時,記憶體0x00000到0x0003ff共1kb的空間用於存放中斷向量表。每個中斷向量占用4個位元組,共可儲存256個中斷向量。2.系統引導時,處在實模式下,只可定址1mb,為什麼要用4個位元組來定址中斷呢處理程式?剛看到的時候,我也很納悶。我們...