1: arm採用的是3級流水線
arm的流水線結構為: 取指 -----> 解碼 ------> 執行
arm**: pc pc- 4 pc - 8
pc是指向被取指的指令,而不是正在執行的指令。(也就是說在此 pc值為0x1008 ,執行的是0x1000的**)
(即:書上摘錄:由於arm 體系結構採用了多級流水線技術,對於arm 指令集而言,pc 總是指向當前指令的下兩條指令的位址,pc 的值為當前指令的位址值加8 個位元組)
3:中斷
(1)當發生中斷的時候,把是此時暫存器pc當前值(0x1008)存入lr_irq(此時的lr是中斷模式下的lr),所以返回時,應該是將lr-4賦值給pc(0x1004)注:有些異常中斷可能要將lr-8或lr賦值給pc。詳細請仔細看arm資料手冊).
(2)當發生irq或fiq後,系統要進入相應的異常模式進行處理,這些是由硬體實現的。
產生異常後,arm核會做以下工作:
<1>. 將正在執行**的位址加4(或者加8)存到lr_irq暫存器裡,即把處於解碼指令的位址存入lr_irq
<2>. 將cpsr複製到spsr,
<3>. 然後將異常模式的狀態強制寫入cpsr
<4>. 強制pc從相關的異常向量處取指!!
中斷結束後:
1. 將spsr複製回cpsr
2. 關中斷
3. 返回原程式,ldr pc,lr_irq
4:因為每個模式下面都有lr_mode,所以當返回原來模式時,原來模式下的lr並沒有被破壞。
5:需要注意的是,當前使用指令stm/str儲存r15時候,儲存的可能是當前指令位址值+8位元組,也可能儲存的是當前的指令位址+12位元組.到底是哪種,取決於晶元的具體的設計方式。無論如何,在同一晶元中,要麼採用當前的指令位址+8,要麼採用當前的指令位址+12。因此對於使用者來講,盡量避免使用stm/str指令來儲存r15的值。但是可以在開始的時候用一段程式對晶元的offset進行測試!
**如下:
sub r1, pc, #4 ;獲得下面的存放下面存放str指令的位址,
str pc,[r0] ; [r0] = pc
ldr r0,[ro] ; r0 = pc
sub r0, r0, r1 ; r0 = pc - r1
大致流程如下:
程式執行方向: 取指 -----> 解碼 ------> 執行
指令: sub r0, r0, r1 ldr r0,[ro] str pc,[r0] sub r1, pc, #4
str(+ 8) 0x1010 0x100c 0x1004 0x1000
str(+12) 0x1014 0x1010 0x1004 0x1000
1): 執行第一條指令sub時:pc= 0x1004
2): 執行第二條指令str時:[r0] = 0x1010(+8) 或 [r0] = 0x1014(+12)
3): 執行第三條指令ldr時:r0 = 0x1010(+8) 或 r0 = 0x1014(+12)
3): 執行第四條指令sub時:r0 = 0x1010- 0x1004 = 0x08 或 r0 = 0x1014- 0x1004 = 0x10
arm7中斷與pc、lr的問題:
1,假設當前是pc,pc-4,pc-8(**流水)
2,發生irq異常,執行保護操作,lr中儲存由於fiq或irq佔先而沒有被執行的指令的位址(即有些資料上把這個位址寫成pc或者當前位址,很費解甚至誤解)的下一條位址
3,清空流水線
4,進入中斷服務程式
5,待流水線填滿,執行操作才被重新掛起(解釋了arm7為什麼是0.9mips)
6,中斷返回前,對lr處理,lr=lr-4,指向之前被清空的已解碼但沒被執行的指令的位址
7,清空流水線,返回
8,重新對丟棄的前一次已解碼指令取指
9,待流水線滿,開始繼續執行
arm中斷保護和恢復 ARM的中斷處理 一
前面的文章介紹了linux的中斷處理機制,而作業系統的中斷處理是和硬體的中斷控制器緊密相關的,本文將以arm這樣乙個具體的處理器為例,講解硬體層面對中斷的支援。arm的中斷控制器被稱為gic generic interrupt controller 最開始的v1版本最多支援8個pe和1020個中斷源...
arm中斷保護和恢復 ARM中斷異常處理的返回
舉個小例子,下面是一段arm彙編 0x3000bl add 0x3004mov r0,0 0x3008mov r1,1 0x300cmov r2,2 area test,code,readonly entry start mov r0,1 mov r1,1 bl add mov r0,0 mov r...
arm中斷保護和恢復 ARM中斷異常處理的返回
舉個小例子,下面是一段arm彙編 位址指令 0x3000 bl add 0x3004 mov r0,0 0x3008 mov r1,1 0x300c mov r2,2 area test,code,readonly entry start mov r0,1 mov r1,1 bl add mov r...