新聞中心

ARM 體系的異常中斷

作者: 時間:2016-11-21 來源:網(wǎng)絡(luò) 收藏
6.1 ARM 體系的異常中斷
6.1.1 異常中斷的種類
當ARM 系統(tǒng)正常的程序執(zhí)行流程發(fā)生暫時的停止時,稱之為異常,ARM 系統(tǒng)對異常的
響應(yīng)過程稱之為異常中斷。例如當ARM 系統(tǒng)檢測到外部的復位信號有效,ARM 系統(tǒng)的程
序就會跳轉(zhuǎn)到復位處理程序。在處理異常之前,ARM 內(nèi)核保存當前的處理器狀態(tài),這樣當
處理程序結(jié)束時可以恢復執(zhí)行原來的程序。當然ARM 體系的產(chǎn)生異常中斷后,會按照一定
的程序進行中斷處理。下面我們分別介紹ARM 系統(tǒng)異常,ARM 體系異常中斷包括復位、
未定義的指令、軟件中斷,指令預(yù)取中斷等。
●復位(Reset ):當處理器的復位引腳有效時,系統(tǒng)產(chǎn)生復位異常中斷,程序跳轉(zhuǎn)到復位異
常中斷處理程序處執(zhí)行。復位異常中斷通常用在下面兩種情況:①系統(tǒng)加電時 ②系統(tǒng)復位
時。
●未定義的指令(undefined instruction):當ARM 處理器或者時系統(tǒng)中是協(xié)處理器認為當前指
令未定義時,產(chǎn)生未定義指令異常中斷。可以通過該異常中斷機仿真浮點向量的運算。
●軟件中斷(Soft interrupt SWI):這時有用戶定義的中斷指令。可用于用戶模式下的程序調(diào)
試特權(quán)操作指令。在實際的操作中可以通過該機制實現(xiàn)系統(tǒng)功能的調(diào)用。
●指令預(yù)取中止(Prefech Abort) :如果處理器預(yù)取的指令的地址不存在,或者該地址不允許
當前指令訪問,當該預(yù)取的指令執(zhí)行時,處理器產(chǎn)生指令預(yù)取中止異常中斷。
數(shù)據(jù)訪問中止(Data Abort):如果數(shù)據(jù)訪問指令的目標地址不存在,或許該地址不允許當前
指令訪問,處理器產(chǎn)生。
●外部中斷請求(IRQ):當處理器的外部中斷請求引腳有效,而且 CPSR 寄存器的 1 位控
制位被清除時,處理器產(chǎn)生外部中斷請求(IRQ)異常中斷。系統(tǒng)中個外設(shè)通常通過該異常
中斷請求處理器服務(wù)。
●快速中斷請求(FIQ ):當處理器外部快速中斷請求引腳有效,而且 CPSR 寄存器的 F
制位被清除時,處理器產(chǎn)生外部中斷請求(FIQ )異常中斷。
6.1.2 處理異常中斷的寄存器
中止模式(Abort abt ) 用于虛擬存儲及存儲保護
未定義指令模式(Undefined und ) 用于支持通過軟件仿真硬件的協(xié)處理器
系統(tǒng)模式(System sys) 用于運行特權(quán)級的操作系統(tǒng)
各種不同的處理器模式可能有對應(yīng)于該處理器的物理寄存器組,如表 6.2 所示。其中,
R13_svc 表示特權(quán)模式下的R13 寄存器,R_13abt 表示中止模式下的R13 寄存器,其余的各
寄存器名稱含義類推。
表 6.2 各處理器模式物理寄存器組
用戶模式 系統(tǒng)模式 特權(quán)模式 中止模式 未定義指令模式 外部中斷模式 快速中斷模式
R0 R0 R0 R0 R0 R0 R0
R1 R1 R1 R1 R1 R1 R1
R2 R2 R2 R2 R2 R2 R2
R3 R3 R3 R3 R3 R3 R3
R4 R4 R4 R4 R4 R4 R4
R5 R5 R5 R5 R5 R5 R5
R6 R6 R6 R6 R6 R6 R6
R7 R7 R7 R7 R7 R7 R7
R8 R8 R8 R8 R8 R8 R8_fiq
R9 R9 R9 R9 R9 R9 R9_fiq
R10 R10 R10 R10 R10 R10 R10_fiq
R11 R11 R11 R11 R11 R11 R11_fiq
R12 R12 R12 R12 R12 R12 R12_fiq
R13 R13 R13_svc R13_abt R13_und R13_irq R13_fiq
R14 R14 R14_svc R14_abt R14_und R14_irq R14_fiq
PC PC PC PC PC PC PC
CPSR CPSR CPSR CPSR CPSR CPSR CPSR
SPSR_svs SPSR_abt SPSR_und SPSR_irq SPSR_fiq
如果異常中斷處理程序中使用它自己的物理寄存器之外的其他寄存器,異常中段處理程序
必須保存和恢復這些寄存器。
上表中各物理寄存器的名稱在ARM 匯編語言中并沒有被預(yù)定義。用戶使用這些寄存器時,
必須使用偽操作RN 來定義這些名稱。例如我們要使用寄存器R13_abt 可以使用下面的語句。
R13_abt RN R13
當幾個異常中斷同時發(fā)生時,就必須按照一定的次序來處理這些異常中斷。在ARM 中通
過給各異常中斷賦予一定的優(yōu)先級來實現(xiàn)這種處理次序。當然有些異常中斷時不可能同時發(fā)
生的,如指令預(yù)取中止異常中斷和阮籍異常中斷時由同一條指令的執(zhí)行觸發(fā),它們時不可能
同時發(fā)生的。處理器執(zhí)行一個特定的異常中斷的過程中,稱為處理器處于特定的中斷模式。
各異常中斷的中斷向量地址以及中斷的處理優(yōu)先級如表 6.3 所示。
表 6.3 各異常中斷的中斷向量地址以及中斷的處理優(yōu)先級
中斷向量地址 異常中斷類型 異常中斷模式 優(yōu)先級(6 級最低)
0x0 復位 特權(quán)模式(SVC) 1
0x4 未定義的指令 未定義的指令中止模式 6
0x8 軟件中斷 特權(quán)模式 6
0x10 數(shù)據(jù)訪問中止 中止模式 2
0x14 保留 未使用 未使用
0x18 外部中斷請求 外部中斷模式 4
0x1c 快速中斷請求 快速中斷模式 3
6.1.4 進入異常中斷
ARM 處理器對異常中斷的響應(yīng)過程如下:
(1) 保存處理器當前狀態(tài)、中斷屏蔽位以及各條件標志位。這是通過將當前程序狀態(tài)寄
存器 CPSR 的內(nèi)容保存到將要執(zhí)行的異常中斷對應(yīng)的SPSR 寄存器中實現(xiàn)的。各異
常中斷有自己的物理 SPSR 寄存器。
(2 ) 設(shè)置當前程序狀態(tài)寄存器CPSR 中相應(yīng)的位。包括設(shè)置CPSR 中的位,使處理器進
入相應(yīng)的執(zhí)行模式;設(shè)置 CPSR 中的位,禁止IRQ 中斷,當進入FIQ 模式時,禁
止FIQ 中斷。
(3) 將寄存器lr_mode 設(shè)置成返回地址。
(4 ) 將程序計數(shù)器值(PC ),設(shè)置成該異常中斷的中斷向量地址,從而跳轉(zhuǎn)到相應(yīng)的異
常中斷處理程序執(zhí)行。
下面我們將分別介紹各種異常中斷響應(yīng)時ARM 系統(tǒng)執(zhí)行的指令。
1.響應(yīng)復位異常中斷
當處理器的復位引腳有效時,處理器中止當前指令。當處理器的復位引腳變成無效時,
處理器開始執(zhí)行下面的操作。
R14_svc=UNPREDICTABLE value
SPSR_svs=UNPREDICTABLE value
CPSR[4:0]=0b10011
CPSR[5]=0
CPSR[6]=1
CPSR[7]=1
If high vectors configured then
PC=0Xffff0000
Else
PC=0x00000000
2. 響應(yīng)未定義指令異常中斷
處理器響應(yīng)未定義指令異常中斷時的處理過程如下面的偽指令所示。
R14_und=address of next interaction after the undefined instruction
SPSR_und=CPSR
CPSR[4:0]=0b11011
CPSR[5]=0
CPSR[7]=1
if high vectors configured then
PC=0Xffff0004
Else
PC=0x00000004
3. 響應(yīng) SWI 異常中斷
處理器響應(yīng) SWI 異常中斷時的處理過程如下面的偽代碼所示。
R14_svc=address of next instruction after the SWI instruction
SPSR_svc=CPSR
CPSR[4:0]=0b10011
CPSR[5]=0
If high vectors configured then
PC=0Xffff0000
Else
PC=0x00000000
4. 響應(yīng)指令預(yù)取中止異常中斷
處理響應(yīng)指令預(yù)取中止異常中斷時的處理過程如下面的偽代碼所示。
R14_aht=address of the aborted instruction + 4
SPSR_abt=CPSR
CPSR[4:0]=0b10111
CPSR[5]=0
CPSR[6]=1
CPSR[7]=1
If high vectors configured then
PC=0Xffff001C
Else
PC=0x0000001c
6.1.5 退出異常中斷
ARM 系統(tǒng)處理完中斷后從異常中斷處理程序中返回包括下面的步驟。
● 恢復被中斷的程序的處理狀態(tài),即將 SPSR_mode 寄存器內(nèi)容復制到當前程序狀態(tài)
寄存器 CPSR中。
● 返回到發(fā)生異常中斷的指令的下一條指令處執(zhí)行。即將 lr_mode 寄存器的內(nèi)容復
制程序計數(shù)器 PC 中。
因為整個應(yīng)用系統(tǒng)時從復位異常中斷處理程序執(zhí)行的,所以復位異常中斷處理程序不需要返
回。
實際上,當異常中斷發(fā)生時,程序程序計數(shù)器 PC 所致的位置對于各種不同的異常中斷是
不同的。同樣,返回地址對于各種不同的異常中斷也是不同的。
下面我們分別介紹各種異常中斷處理程序的返回方法。
1.SWI 和未定義指令異常中斷處理程序的返回
SWI 和未定義指令異常中斷是由當前執(zhí)行的指令自身產(chǎn)生的,當 SWI 和未定義指令異常中斷
產(chǎn)生時,程序及順氣 PC的值還未更新,它指向當前指令后面第 2 指令(對于 ARM指令來說,
它指向當前指令地址加 8 個字節(jié)的位置;對于 Thumb 指令來說,它指向當前指令地址加 4
個字節(jié)的位置)。當 SWI 和未定義指令異常中斷發(fā)生時,處理器將值(PC-4)保存到異常模
式下的寄存器 lr_mode中。這時(PC-4)即指向當前的下一條指令。因此返回操作可以通過
下面的指令來實現(xiàn):
MOV PC,LR
該指令將寄存器 LR 中的值復制到程序計數(shù)器 PC 中,實現(xiàn)程序返回,同時將 SPSR_mode
寄存器內(nèi)容復制到當前程序狀態(tài)寄存器 CPSR 中。
當異常中斷處理程序中使用了數(shù)據(jù)棧時,可以通過下面的指令在進入異常中斷處理程序時
保存被中斷程序的執(zhí)行現(xiàn)場,在退出異常中斷處理程序時恢復被中斷程序執(zhí)行現(xiàn)場。異常中
斷處理程序中使用的數(shù)據(jù)棧由用戶提供。
STMFD SP! ,(reglist lr)
; ...
LDMFD SP! ,reglist pc)^
在上述指令中,reglist 是異常中斷處理程序使用的寄存器立表。標識符^指示將
SPSR_mode 寄存器內(nèi)容復制到當前程序狀態(tài)寄存器 CPSR 中。該指令只能在特權(quán)模式下使用。
2.IRQ和 FIQ 異常中斷處理程序的返回
通常處理器執(zhí)行完當前指令后,查詢 IRQ 中斷引腳及 FIQ 中斷引腳,并且查看系統(tǒng)時否允
許 IRQ 中斷及 FIQ 中斷。如果有中斷引腳有效,并且系統(tǒng)允許該中斷產(chǎn)生,處理器將產(chǎn)生
IRQ 異常中斷或 FIQ 異常中斷。當 IRQ 和FIQ 異常中斷產(chǎn)生時,程序計數(shù)器 PC 的值也經(jīng)更
新,它指向當前指令后面第 3 條指令(對預(yù) ARM 指令來說,它指向當前指令地址加 12 個字
節(jié)的位置;對于 Thumb 指令來說,它指向當前指令地址加 6 個字節(jié)的位置)。當 IRQ 和 FIQ
異常中斷發(fā)生時,處理器將值(PC-4)保存到異常模式下的寄存器 lr_mode 中。這時(PC-4)
即指向當前指令后的第 2 條指令。因此返回操作可以通過下面的指令來實現(xiàn):
SUBS PC , LD, #4
該指令將寄存器LR中的值減4后,復制到程序計數(shù)器PC中,實現(xiàn)程序返回,同時將SPSR_mode
寄存器內(nèi)容復制到當前程序狀態(tài)寄存器 CPSR 中。
當異常中斷處理程序中使用了數(shù)據(jù)棧時,可以通過下面的指令進入異常中斷處理程序時保存
被中斷程序的執(zhí)行現(xiàn)場。異常中斷處理程序中使用的數(shù)據(jù)棧由用戶提供。
SUBS LR,LR,#4
STMFD SP!,{reglistl,lr}
; ...
LDMFD SP!{reglist ,pc}^
在上述指令中,reglist 是異常中斷處理程序中使用的寄存器列表。標識符^指示將
SPSR_mode 寄存器內(nèi)容復制到當前程序程序寄存器 CPSR 中。該指令只能在特權(quán)模式下使用。
3.預(yù)取中止異常中斷處理程序的返回
在指令預(yù)取時,如果目標地址時非法的,該指令將被標記稱有問題的指令。這時,流水線上
該指令之前的指令繼續(xù)執(zhí)行。當執(zhí)行到該被標記稱有問題的指令時,處理器產(chǎn)生指令預(yù)取中
止異常中斷。
當發(fā)生指令預(yù)取中止異常中斷時,程序要返回到該有問題的指令處,重新讀取并執(zhí)行該
指令。因此指令預(yù)取中止異常中斷程序應(yīng)該返回到產(chǎn)生該指令預(yù)取中止異常中斷的指令處。
而不是像前面兩種情況下返回到發(fā)生中斷的指令的下一條指令。
指令預(yù)取中止異常中斷時由當前執(zhí)行的指令自身產(chǎn)生的,當指令預(yù)取中止異常中斷產(chǎn)生
時,程序計數(shù)器 PC 的值還未更新,指向它當前指令后面第 2 條指令(對于 ARM 指令來說,
它指向當前指令地址加 8 各字節(jié)的位置;對于 Thumb 指令來說,它指向當前指令地址 4個字
節(jié)的位置)。當指令預(yù)取中止異常中斷發(fā)生時,處理器將值(PC-4)保存到異常模式下的寄
存器 lr_mode 中。這時(PC-4)即指向當前指令的下一條指令。因此返回操作可以通過下面
的指令來實現(xiàn):
SUSB PC , LR ,#4
該指令將寄存器 LR 中的值減 4 后,復制到程序計數(shù)器 PC 中,實現(xiàn)程序的返回,同時將
SPSR_mode 寄存器內(nèi)容復制到當前程序狀態(tài)寄存器 CPSR 中。
當異常中斷處理程序中使用了數(shù)據(jù)棧時,可以通過下面的指令在進入異常中斷處理程序
時保存被中斷程序的執(zhí)行現(xiàn)場,在推出異常中斷處理程序時恢復被中斷程序的執(zhí)行現(xiàn)場。異
常中斷處理程序中使用的數(shù)據(jù)棧由用戶提供。
SUBS LR ,LR ,#4
STMFD SP! ,{reglist ,lr}
;…
LDMFD SP!,{reglist ,pc}^
在上述指令中,reglist 是異常中斷處理程序中使用的寄存器列表。標識符^指示將
SPSR_mode 寄存器內(nèi)容復制到當前程序狀態(tài)寄存器 CPSR 中。該指令只能在特權(quán)模式下使用。
4.數(shù)據(jù)訪問中止異常中斷處理程序返回
當發(fā)生數(shù)據(jù)訪問中止異常中斷時,程序要返回到該有問題的數(shù)據(jù)訪問處,重新訪問該數(shù)
據(jù),因此數(shù)據(jù)訪問中止異常中斷程序應(yīng)該返回到產(chǎn)生該數(shù)據(jù)訪問中止異常中斷的指令
處,而不是像前面兩種情況下返回到當前指令的下一條指令。
數(shù)據(jù)訪問中止異常中斷是由數(shù)據(jù)訪問指令產(chǎn)生的,當數(shù)據(jù)訪問中止異常中斷產(chǎn)生
時,程序計數(shù)器 PC 的值已經(jīng)更新,它指向當前指令后面第二條指令(對于 ARM 指令來
說,它指向當前指令地址加 8 個字節(jié)的位置;對于 Thumb指令來說,它指向當前指令地
址加 4 個字節(jié)的位置)。當數(shù)據(jù)訪問中止異常中斷發(fā)生時,處理器將值(PC-4)保存到
異常模式下的寄存器 lr_mode 中。這時(PC-4)即指向當前指令的后第二條指令。因此
返回操作可以通過下面的指令來實現(xiàn):
SUSB PC ,LR #8
該指令將寄存器 LR 中的值減 8 后,復制到程序計數(shù)器 PC中,實現(xiàn)程序返回,同
時將 SPSR_mode 寄存器內(nèi)容復制到當前程序狀態(tài)寄存器 CPSR中。
當異常中斷處理程序中使用了數(shù)據(jù)棧時,可以通過下面的指令在進入異常中斷處理
程序時保存被中斷程序保存的執(zhí)行現(xiàn)場,在退出異常中斷處理程序時恢復被中斷程序的
執(zhí)行現(xiàn)場。異常中斷處理程序中使用的數(shù)據(jù)棧由用戶提供。
SUSB LR ,LR #8
STMFD SP ! ,{eglist ,lr}
;...
LDMFD SP !{reglist,pc}^
在上述指令中,reglist是異常中斷處理程序中使用的寄存器列表。標識符^指示將
SPSR_mode 寄存器內(nèi)容復制到當前程序狀態(tài)寄存器 CPSR 中。該指令只能在特權(quán)模式下
使用。



關(guān)鍵詞: ARM體系異常中

評論


技術(shù)專區(qū)

關(guān)閉