arm中斷保護和恢復 ARM異常中斷返回的幾種情況

2021-10-13 02:39:23 字數 2327 閱讀 8502

重要基礎知識:r15(pc)總是指向「正在取指」的指令,而不是指向「正在執行」的指令或正在「解碼」的指令。一般來說,人們習慣性約定將「正在執行的指令作為參考點」,稱之為當前第一條指令,因此 pc總是指向第三條指令。當 arm 狀態時,每條指令為 4 位元組長,所以 pc 始終指向該指令位址加 8 位元組的位址,即:pc 值=當前程式執行位置+8;

而 ads 中的 pc,是為了除錯看著方便而修改過的,它指向的是正在執行的指令,即「真正 pc-8」!

1.swi 和和未定義指令異常中斷的返回:

指令位址

a         pc-8  當前指令為 swi 或未定義指令 此時發生中斷.pc 的值還沒有更新.

a+4       pc-4  中斷時處理器將 pc-4 儲存到 lr。       ;lr!

a+8       pc

返回時,從發生中斷的指令 a(pc-8)的下一條指令 a+4(pc-4)處開始執行,所以直接把 lr 的值賦給 pc 就行了,具體指令為 movpc,lr  (pc=a+4=lr)

白話解釋:對於 swi 和未定義指令異常: 發生異常時 pc 沒有更新,根據 arm 的**流水線原理,pc 沒有更新,仍然等於(a+8); lr= pc – 4(這時處理器決定的,無法更改!)即 a+4。

由於這類異常返回後應執行下一條指令(a+4),所以返回時,pc= lr 即可。

2.irq 和 fiq 異常中斷處理的返回:

指令位址  對應於 pc

a         pc-8      執行此指令完成後(!)查詢 irq 及 fiq,如果有中斷請求則產生中斷.

a+4       pc-4

a+8       pc         ;lr!

(此時 pc 的值已經更新,指向 a+12.將當前 pc-4,即 a+8 )。

儲存到 lr.返回時,要接著執行 a+4(lr-4)處的指令,所以返回指令為

subspc, lr,#4(pc=a+4=lr-4)

白話解釋:對於普中斷和快中斷異常,中斷必須在一條指令執行完以後被檢測到,如正在執行指令甲時發生了中斷,不等指令甲執行完是不會處理該中斷的,發生異常時 pc 已經更新(a+12); lr= pc – 4(這時處理器決定的,無法更改!)即 a+8 返回後,應執行被中斷而沒有執行的指令(上面的 a+4),所以返回時,pc = lr-4

3,指令預取中止異常中斷處理的返回:

指令位址

a     pc-8     執行本指令時發生中斷,

a+4   pc-4     處理器將 a+4(pc-4)儲存到 lr.    ;lr!

a+8   pc

返回時,發生指令預取中止的指令 a(pc-8)處重新執行,所以返回指令為

subspc, lr,#4(pc=a=lr-4)

白話解釋:對於預取指令中止異常,發生預取指令異常時,是在執行時發生的異常,pc 未更新,即 pc= a+8;lr = pc – 4(這時處理器決定的,無法更改!)即 a+4。

由於這類異常返回後應重新執行異常的那個指令(a),所以返回時,pc= lr-4

4,資料訪問中止異常中斷處理的返回:

指令位址

a          pc-8    本指令訪問有問題的資料,產生中斷時,pc 的值已經更新

a+4        pc-4    中斷發生時 pc=a+12,處理器將 a+8(pc-4)儲存到 lr.

a+8        pc        ;lr!

返回時,要返回到 a 處繼續執行,所以指令為 subspc,  lr,#8.(pc=a=lr-8)

白話解釋:對於資料訪問中止異常,發生資料訪問中止異常時,是在執行時訪問資料錯誤導致的異常,pc 已經更新,即 pc= a+12

lr= pc – 4(這時處理器決定的,無法更改!)即 a+8。

由於這類異常返回後應重新執行異常的那個指令(a),所以返回時,pc= lr-8

小節:ø 引起 pc 更新的原因一種是資料中止,還有就是中斷了.

ø 中斷必須是在一條指令執行完畢後才能被檢測到,所以它中斷的只是還未執行的那條指令(pc - 8),所以 pc= lr – 4;

ø 與中斷相同,swi 和未定義指令異常也是返回到下一條指令(pc - 4),只是他們在執行時,pc 的值並沒有更新,所以 pc= lr;

ø 預取指令中止異常,也沒有發生 pc  更新,但它還得重新執行發生異常的那條指令,所以 pc= lr – 4;

ø 資料訪問中止異常,發生了 pc  更新,並且它也需要重新執行發生異常的那條指令,所以 pc= lr – 8。

如何解釋arm狀態與thumb狀態下的fiq,irq,pabt(指令預取終止),dabt(資料預取錯誤)的返回指令一樣: 猜測:thumb的取指是 一次取兩條! 這樣就可以解釋為什麼是一樣的。但是還不確定。

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...

arm中斷保護和恢復 ARM異常中斷的原因及處理措

當arm異常中斷發生時,系統執行完當前指令後,將跳轉到相應的異常中斷處理程式處執行。當異常中斷處理程式執行完成後,程式返回到發生中斷指令的下條指令處執 行。在進入異常中斷處理程式時,要儲存被中斷程式的執行現場,從異常中斷處理程式退出時,要恢復被中斷程式的執行現場。1 引起異常的原因 對於arm核,可...