ARM 體系的異常中斷
6.1.1 異常中斷的種類
響應(yīng)過程稱之為異常中斷。例如當(dāng)ARM 系統(tǒng)檢測到外部的復(fù)位信號有效,ARM 系統(tǒng)的程
序就會跳轉(zhuǎn)到復(fù)位處理程序。在處理異常之前,ARM 內(nèi)核保存當(dāng)前的處理器狀態(tài),這樣當(dāng)
處理程序結(jié)束時可以恢復(fù)執(zhí)行原來的程序。當(dāng)然ARM 體系的產(chǎn)生異常中斷后,會按照一定
的程序進(jìn)行中斷處理。下面我們分別介紹ARM 系統(tǒng)異常,ARM 體系異常中斷包括復(fù)位、
未定義的指令、軟件中斷,指令預(yù)取中斷等。
●復(fù)位(Reset ):當(dāng)處理器的復(fù)位引腳有效時,系統(tǒng)產(chǎn)生復(fù)位異常中斷,程序跳轉(zhuǎn)到復(fù)位異
常中斷處理程序處執(zhí)行。復(fù)位異常中斷通常用在下面兩種情況:①系統(tǒng)加電時 ②系統(tǒng)復(fù)位
時。
●未定義的指令(undefined instruction):當(dāng)ARM 處理器或者時系統(tǒng)中是協(xié)處理器認(rèn)為當(dāng)前指
令未定義時,產(chǎn)生未定義指令異常中斷??梢酝ㄟ^該異常中斷機(jī)仿真浮點(diǎn)向量的運(yùn)算。
●軟件中斷(Soft interrupt SWI):這時有用戶定義的中斷指令。可用于用戶模式下的程序調(diào)
試特權(quán)操作指令。在實(shí)際的操作中可以通過該機(jī)制實(shí)現(xiàn)系統(tǒng)功能的調(diào)用。
●指令預(yù)取中止(Prefech Abort) :如果處理器預(yù)取的指令的地址不存在,或者該地址不允許
當(dāng)前指令訪問,當(dāng)該預(yù)取的指令執(zhí)行時,處理器產(chǎn)生指令預(yù)取中止異常中斷。
數(shù)據(jù)訪問中止(Data Abort):如果數(shù)據(jù)訪問指令的目標(biāo)地址不存在,或許該地址不允許當(dāng)前
指令訪問,處理器產(chǎn)生。
●外部中斷請求(IRQ):當(dāng)處理器的外部中斷請求引腳有效,而且 CPSR 寄存器的 1 位控
制位被清除時,處理器產(chǎn)生外部中斷請求(IRQ)異常中斷。系統(tǒng)中個外設(shè)通常通過該異常
中斷請求處理器服務(wù)。
●快速中斷請求(FIQ ):當(dāng)處理器外部快速中斷請求引腳有效,而且 CPSR 寄存器的 F 控
制位被清除時,處理器產(chǎn)生外部中斷請求(FIQ )異常中斷。
6.1.2 處理異常中斷的寄存器
中止模式(Abort abt ) 用于虛擬存儲及存儲保護(hù)
未定義指令模式(Undefined und ) 用于支持通過軟件仿真硬件的協(xié)處理器
系統(tǒng)模式(System sys) 用于運(yùn)行特權(quán)級的操作系統(tǒng)
R13_svc 表示特權(quán)模式下的R13 寄存器,R_13abt 表示中止模式下的R13 寄存器,其余的各
寄存器名稱含義類推。
用戶模式 系統(tǒng)模式 特權(quán)模式 中止模式 未定義指令模式 外部中斷模式 快速中斷模式
CPSR CPSR CPSR CPSR CPSR CPSR CPSR
必須保存和恢復(fù)這些寄存器。
必須使用偽操作RN 來定義這些名稱。例如我們要使用寄存器R13_abt 可以使用下面的語句。
過給各異常中斷賦予一定的優(yōu)先級來實(shí)現(xiàn)這種處理次序。當(dāng)然有些異常中斷時不可能同時發(fā)
生的,如指令預(yù)取中止異常中斷和阮籍異常中斷時由同一條指令的執(zhí)行觸發(fā),它們時不可能
同時發(fā)生的。處理器執(zhí)行一個特定的異常中斷的過程中,稱為處理器處于特定的中斷模式。
各異常中斷的中斷向量地址以及中斷的處理優(yōu)先級如表 6.3 所示。
中斷向量地址 異常中斷類型 異常中斷模式 優(yōu)先級(6 級最低)
0x0 復(fù)位 特權(quán)模式(SVC) 1
0x4 未定義的指令 未定義的指令中止模式 6
0x8 軟件中斷 特權(quán)模式 6
0x10 數(shù)據(jù)訪問中止 中止模式 2
0x14 保留 未使用 未使用
0x18 外部中斷請求 外部中斷模式 4
0x1c 快速中斷請求 快速中斷模式 3
6.1.4 進(jìn)入異常中斷
6.1.5 退出異常中斷
ARM 系統(tǒng)處理完中斷后從異常中斷處理程序中返回包括下面的步驟。
因?yàn)檎麄€應(yīng)用系統(tǒng)時從復(fù)位異常中斷處理程序執(zhí)行的,所以復(fù)位異常中斷處理程序不需要返
回。
不同的。同樣,返回地址對于各種不同的異常中斷也是不同的。
下面我們分別介紹各種異常中斷處理程序的返回方法。
1.SWI 和未定義指令異常中斷處理程序的返回
SWI 和未定義指令異常中斷是由當(dāng)前執(zhí)行的指令自身產(chǎn)生的,當(dāng) SWI 和未定義指令異常中斷
產(chǎn)生時,程序及順氣 PC的值還未更新,它指向當(dāng)前指令后面第 2 指令(對于 ARM指令來說,
它指向當(dāng)前指令地址加 8 個字節(jié)的位置;對于 Thumb 指令來說,它指向當(dāng)前指令地址加 4
個字節(jié)的位置)。當(dāng) SWI 和未定義指令異常中斷發(fā)生時,處理器將值(PC-4)保存到異常模
式下的寄存器 lr_mode中。這時(PC-4)即指向當(dāng)前的下一條指令。因此返回操作可以通過
下面的指令來實(shí)現(xiàn):
MOV PC,LR
寄存器內(nèi)容復(fù)制到當(dāng)前程序狀態(tài)寄存器 CPSR 中。
保存被中斷程序的執(zhí)行現(xiàn)場,在退出異常中斷處理程序時恢復(fù)被中斷程序執(zhí)行現(xiàn)場。異常中
斷處理程序中使用的數(shù)據(jù)棧由用戶提供。
SPSR_mode 寄存器內(nèi)容復(fù)制到當(dāng)前程序狀態(tài)寄存器 CPSR 中。該指令只能在特權(quán)模式下使用。
2.IRQ和 FIQ 異常中斷處理程序的返回
許 IRQ 中斷及 FIQ 中斷。如果有中斷引腳有效,并且系統(tǒng)允許該中斷產(chǎn)生,處理器將產(chǎn)生
IRQ 異常中斷或 FIQ 異常中斷。當(dāng) IRQ 和FIQ 異常中斷產(chǎn)生時,程序計數(shù)器 PC 的值也經(jīng)更
新,它指向當(dāng)前指令后面第 3 條指令(對預(yù) ARM 指令來說,它指向當(dāng)前指令地址加 12 個字
節(jié)的位置;對于 Thumb 指令來說,它指向當(dāng)前指令地址加 6 個字節(jié)的位置)。當(dāng) IRQ 和 FIQ
異常中斷發(fā)生時,處理器將值(PC-4)保存到異常模式下的寄存器 lr_mode 中。這時(PC-4)
即指向當(dāng)前指令后的第 2 條指令。因此返回操作可以通過下面的指令來實(shí)現(xiàn):
該指令將寄存器LR中的值減4后,復(fù)制到程序計數(shù)器PC中,實(shí)現(xiàn)程序返回,同時將SPSR_mode
寄存器內(nèi)容復(fù)制到當(dāng)前程序狀態(tài)寄存器 CPSR 中。
當(dāng)異常中斷處理程序中使用了數(shù)據(jù)棧時,可以通過下面的指令進(jìn)入異常中斷處理程序時保存
被中斷程序的執(zhí)行現(xiàn)場。異常中斷處理程序中使用的數(shù)據(jù)棧由用戶提供。
SPSR_mode 寄存器內(nèi)容復(fù)制到當(dāng)前程序程序寄存器 CPSR 中。該指令只能在特權(quán)模式下使用。
3.預(yù)取中止異常中斷處理程序的返回
在指令預(yù)取時,如果目標(biāo)地址時非法的,該指令將被標(biāo)記稱有問題的指令。這時,流水線上
該指令之前的指令繼續(xù)執(zhí)行。當(dāng)執(zhí)行到該被標(biāo)記稱有問題的指令時,處理器產(chǎn)生指令預(yù)取中
止異常中斷。
指令。因此指令預(yù)取中止異常中斷程序應(yīng)該返回到產(chǎn)生該指令預(yù)取中止異常中斷的指令處。
而不是像前面兩種情況下返回到發(fā)生中斷的指令的下一條指令。
時,程序計數(shù)器 PC 的值還未更新,指向它當(dāng)前指令后面第 2 條指令(對于 ARM 指令來說,
它指向當(dāng)前指令地址加 8 各字節(jié)的位置;對于 Thumb 指令來說,它指向當(dāng)前指令地址 4個字
節(jié)的位置)。當(dāng)指令預(yù)取中止異常中斷發(fā)生時,處理器將值(PC-4)保存到異常模式下的寄
存器 lr_mode 中。這時(PC-4)即指向當(dāng)前指令的下一條指令。因此返回操作可以通過下面
的指令來實(shí)現(xiàn):
SUSB PC , LR ,#4
該指令將寄存器 LR 中的值減 4 后,復(fù)制到程序計數(shù)器 PC 中,實(shí)現(xiàn)程序的返回,同時將
SPSR_mode 寄存器內(nèi)容復(fù)制到當(dāng)前程序狀態(tài)寄存器 CPSR 中。
時保存被中斷程序的執(zhí)行現(xiàn)場,在推出異常中斷處理程序時恢復(fù)被中斷程序的執(zhí)行現(xiàn)場。異
常中斷處理程序中使用的數(shù)據(jù)棧由用戶提供。
SPSR_mode 寄存器內(nèi)容復(fù)制到當(dāng)前程序狀態(tài)寄存器 CPSR 中。該指令只能在特權(quán)模式下使用。
4.?dāng)?shù)據(jù)訪問中止異常中斷處理程序返回
評論