1、異常處理:
arm處理器的執行模式有:
svc(管理模式):復位、執行swi指令,供作業系統使用的一種保護模式
fiq(快速中斷模式):發生高優先順序中斷,用於高速資料傳輸或通道處理
irq(中斷模式):發生低優先順序的中斷,使用者通用的中斷處理
abort(中止模式):用於虛擬儲存或儲存保護
undef(未定義模式):當未定義的指令執行時進入該模式
user(使用者模式):正常程式執行的模式,用於應用程式
system(系統模式):用於執行特權級的作業系統任務
另外,在除user(使用者模式)外的其他6種處理器模式成為特權模式,則user模式為非特權模式。
user、system成為非異常模式,其他5種則稱之為異常模式。
擴充套件:
處理器的模式通過軟體進行切換,也可以通過外部中斷或異常處理過程進行切換。大多數的使用者程式執行在使用者模式下,這時,應用程式不能訪問一些受到作業系統保護的資源,應用程式也不能直接進行處理器的模式切換。當需要進行處理器的模式切換時,用用程式可以產生異常,在異常處理的過程中進行處理器模式的切換。這種體系結構可以使作業系統控制整個的系統資源。
當程式發生異常中斷使,處理器進入相應的異常模式。在每一種異常模式中都有一組暫存器,提供相應的異常程式使用,這樣可以保證進入異常模式時,使用者模式下的暫存器不被破壞。
系統模式並不是通過異常過程進入的,它和使用者模式具有一樣的暫存器,但是系統模式資料特權模式,可以訪問所有的系統資源,也可以直接進行處理器模式的切換,它主要提供系統任務使用。
異常:
1)復位異常,進入到管理模式(svc)
2)未定義指令異常,進入未定義模式
3)軟中斷異常,執行swi模式,進入svc管理模式
4)預取指令異常,沒有取到指定的指令,進入中止模式
5)資料中指異常,沒有取到指定的資料,進入中止模式
6)中斷,進入中斷模式
7)快速中斷,進入快速中斷模式
2、異常發生時如何處理異常:
cpu做:
1)拷貝cpsr到相應的異常模式的spsr,spsr_mode=cpsr
2)設定適當的cpsr位:
a、將處理器的狀態改為arm狀態,cpsr的bit[5]=0
b、改變處理器的工作模式,進入到相應的異常模式,改變cpsr的bit[4:0]到對應的異常模式
c、設定中斷禁止位
3)保護返回位址到 lr_mode = pc - 4
4)設定pc為相應的異常向量的位址
5)處理異常,執行異常處理程式
6)異常處理完畢,返回
3、中斷處理
1)預取指令異常:
…… sub r1, r1, #0x6
add r0, r0, #0x1
bic r0, r0, #0xf
cmp r0, r1
…… a、當sub取指,根本沒有取到,直到sub進入執行階段,發生異常
b、lr=pc-4(pc=bic)
=add
c、異常返回,再次取指sub指令,subs pc, lr , #4
2)軟中斷swi指令
…… sub r1, r1, #0x6
swi 1 @發生軟中斷異常
add r0, r0, #0x1
bic r0, r0, #0xf
…… 取指,解碼,執行,在swi指令的第三個階段,執行階段,發生異常
a、spsr_svc=cpsr
b、改cpsr的t位,0,即arm狀態
c、改cpsr的mode位[4:0],改到svc管理模式
d、禁止中斷位
e、儲存返回位址lr_mode = pc – 4 (pc = bic) = add
f、pc=0x8
g、處理異常,執行異常處理程式
h、異常處理完畢,異常返回,返回到add指令繼續執行,
movs pc, lr ,cpsr=spsr_svc
3)未定義指令異常
…… sub r1, r1, #0x6
abc #3 @發生未定義指令異常
add r0, r0, #0x1
bic r0, r0, #0xf
…… 取指,解碼,執行,當abc未定義指令進入執行階段,發生異常
a.spsr_und = cpsr
b.改cpsr的t位,0
c.改cpsr的mode[4:0],改到未定義模式
d.禁止中斷位
e.lr=pc-4 (pc=bit)
=add
f.pc=未定義異常的向量表入口
g.處理未定義異常
h.異常處理完畢,異常返回到add指令繼續執行,
movs pc, lr cpsr=spsr_und
4)fiq irq
…… sub r1, r1, #0x6
add r0, r0, #0x1
bic r0, r0, #0xf
cmp r0, r1
…… 當執行到sub指令時,來了中斷,雖然中斷來了,等sub指令執行完畢,處理中斷
lr=pc-4 (pc=cmp)
=bic
異常返回時,執行add指令,subs pc, lr, #4 cpsr = spsr
5)資料異常
…… ldr r0, [r2] //取指,解碼,執行,訪存,回寫
sub r1, r1, #0x6
add r0, r0, #0x1
bic r0, r0, #0xf
cmp r0, r1
…… a.在ldr指令的訪存階段發生異常,pc=bic
b.lr=pc-4=add
c.異常返回,再次取指ldr指令,subs pc, lr ,#8
總結:異常的返回
swi軟中斷異常
未定義的指令異常
中斷 快速中斷
預取指令
資料異常
1、何時發生異常?
執行階段 8 (swi 、未定義、預取指令)
執行完畢階段 12(中斷、快速中斷)
訪存階段 12 (資料異常)
根據pc值確定當前的pc值
2、cpu:自動的將 lr = pc -4 確定當前lr儲存的誰的位址
3、異常處理完畢,返回時,執行的指令是哪一條
1)重新執行發生異常的指令(預取指令,資料異常)
2)執行發生異常的下一條指令
異常向量表
——————————————————————
0x1c | ldr pc,fiq_hdl | 快速中斷異常
0x18 | ldr pc,irq_hdl | 中斷異常
0x14 | b . | 保留
0x10 | ldr pc,dat_hdl | 資料異常
0xc | ldr pc,pre_hdl | 預取指令異常
0x8 | ldr pc,swi_hdl | 軟中斷異常
0x4 | ldr pc,und_hdl (修改pc) | 未定義異常
0x0 | b reset | 復位異常
—————————— |
異常向量表只是起到乙個異常跳轉的作用
4、異常優先順序
異常在當前指令執行完成後才被響應,多個異常可以在同一時刻產生
異常指定了優先順序的固定順序:
reset
data abort
fiq
irq
prefetch abort
swi
udefined instruction
5、軟中斷
系統在執行**,執行到swi 0x01指令,在該指令的執行階段,發生軟中斷異常
cpu:
1)備份cpsr ,spsr_svc = cpsr
2)修改cpsr
改狀態,arm狀態,cpsr 的bit[5]= 0
改模式,svc管理模式,cpsr的bit[4:0]= 10011
3) 儲存返回位址 lr_svc = pc - 4
4)儲存pc為異常向量表中對應的位址,pc = 0x8,對應的指令「
ldr pc,swi_hdl
5)swi_hdl就是swi
6)當c函式處理完畢之後,返回彙編swi_hdl,再做最後的異常返回
7)movs pc,lr cpsr = spsr
8)繼續執行swi_hdl之後下一條的指令
ARM異常處理
arm支援7種型別的異常,它們是 復位異常 未定義指令異常 軟中斷指令異常 預取指令異常 資料中止訪問異常 中斷異常 快速中斷異常 arm異常向量表 當異常發生時,arm將做如下事情 1 將異常發生處下條指令位址儲存到相應工作模式下lr暫存器中 2 將cpsr暫存器值複製到相應異常模式下的spsr暫...
ARM異常處理流程
在學習與開發arm處理器的過程中,乙個不能繞開的話題就是異常處理流程。它在arm的體系架構中,佔據著不可動搖的重要地位。此處就以coterx a系列的arm處理器簡單分析一下異常中斷處理流程。說異常處理流程之前,我們先說一下arm處理器的工作模式和異常源。在coterx a系列之前的arm處理器,一...
arm異常處理流程
1.什麼是異常?cpu正常執行的時候,出現一些突發事件,我們的cpu就必須暫停當前程式的執行,去處理這些異常 2.cpu中有哪些異常?1.reset 上電 重啟 2.undef 流水線中某個非法指令到達執行狀態的時候執行 3.swi 軟中斷指令 4.prefetch 當乙個指令被從記憶體中預取時,由...