ARM 體系的異常中斷
6.1.1 異常中斷的種類
響應(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)
R13_svc 表示特權(quán)模式下的R13 寄存器,R_13abt 表示中止模式下的R13 寄存器,其余的各
寄存器名稱含義類推。
用戶模式 系統(tǒng)模式 特權(quán)模式 中止模式 未定義指令模式 外部中斷模式 快速中斷模式
CPSR CPSR CPSR CPSR CPSR CPSR CPSR
必須保存和恢復這些寄存器。
必須使用偽操作RN 來定義這些名稱。例如我們要使用寄存器R13_abt 可以使用下面的語句。
過給各異常中斷賦予一定的優(yōu)先級來實現(xiàn)這種處理次序。當然有些異常中斷時不可能同時發(fā)
生的,如指令預(yù)取中止異常中斷和阮籍異常中斷時由同一條指令的執(zhí)行觸發(fā),它們時不可能
同時發(fā)生的。處理器執(zhí)行一個特定的異常中斷的過程中,稱為處理器處于特定的中斷模式。
各異常中斷的中斷向量地址以及中斷的處理優(yōu)先級如表 6.3 所示。
中斷向量地址 異常中斷類型 異常中斷模式 優(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 進入異常中斷
6.1.5 退出異常中斷
ARM 系統(tǒng)處理完中斷后從異常中斷處理程序中返回包括下面的步驟。
因為整個應(yīng)用系統(tǒng)時從復位異常中斷處理程序執(zhí)行的,所以復位異常中斷處理程序不需要返
回。
不同的。同樣,返回地址對于各種不同的異常中斷也是不同的。
下面我們分別介紹各種異常中斷處理程序的返回方法。
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
寄存器內(nèi)容復制到當前程序狀態(tài)寄存器 CPSR 中。
保存被中斷程序的執(zhí)行現(xiàn)場,在退出異常中斷處理程序時恢復被中斷程序執(zhí)行現(xiàn)場。異常中
斷處理程序中使用的數(shù)據(jù)棧由用戶提供。
SPSR_mode 寄存器內(nèi)容復制到當前程序狀態(tài)寄存器 CPSR 中。該指令只能在特權(quán)模式下使用。
2.IRQ和 FIQ 異常中斷處理程序的返回
許 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):
該指令將寄存器LR中的值減4后,復制到程序計數(shù)器PC中,實現(xiàn)程序返回,同時將SPSR_mode
寄存器內(nèi)容復制到當前程序狀態(tài)寄存器 CPSR 中。
當異常中斷處理程序中使用了數(shù)據(jù)棧時,可以通過下面的指令進入異常中斷處理程序時保存
被中斷程序的執(zhí)行現(xiàn)場。異常中斷處理程序中使用的數(shù)據(jù)棧由用戶提供。
SPSR_mode 寄存器內(nèi)容復制到當前程序程序寄存器 CPSR 中。該指令只能在特權(quán)模式下使用。
3.預(yù)取中止異常中斷處理程序的返回
在指令預(yù)取時,如果目標地址時非法的,該指令將被標記稱有問題的指令。這時,流水線上
該指令之前的指令繼續(xù)執(zhí)行。當執(zhí)行到該被標記稱有問題的指令時,處理器產(chǎn)生指令預(yù)取中
止異常中斷。
指令。因此指令預(yù)取中止異常中斷程序應(yīng)該返回到產(chǎn)生該指令預(yù)取中止異常中斷的指令處。
而不是像前面兩種情況下返回到發(fā)生中斷的指令的下一條指令。
時,程序計數(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 中。
時保存被中斷程序的執(zhí)行現(xiàn)場,在推出異常中斷處理程序時恢復被中斷程序的執(zhí)行現(xiàn)場。異
常中斷處理程序中使用的數(shù)據(jù)棧由用戶提供。
SPSR_mode 寄存器內(nèi)容復制到當前程序狀態(tài)寄存器 CPSR 中。該指令只能在特權(quán)模式下使用。
4.數(shù)據(jù)訪問中止異常中斷處理程序返回
評論