異常中斷 1

2021-06-21 15:27:14 字數 2481 閱讀 3449

1.產生異常時,處理器採取如下動作。

步驟1:將要處理的當前程式狀態暫存器(cpsr)複製到程式狀態備份暫存器(spsr),以儲存當前模式、中斷遮蔽和條件標誌等。這個spsr使指即將進入的狀態的spsr。

步驟2:轉至arm狀態(僅限於能處理thumb**的處理器)。

步驟3:改變相應的cprs模式位以便:改變相應的模式及該模式下相應編組暫存器中的對映。禁用中斷。發生中斷時,禁用irq。發生fiq時和在復位時,禁用fiq。

對於不能處理thumb**的arm處理器,這將強行跳轉至相應的異常處理程式。對於能處理thumb**的處理器,步驟2中由thumb狀態轉至arm狀態保證了安裝在該向量位址(跳轉或與pc相關的載入)的arm指令能夠正確讀取、解碼和執行。

2.從異常處理程式的返回。

從異常返回的方法取決於該異常處理程式使用或不使用堆操作。要返回到異常發生處繼續執行,異常處理程式必須:

從spsr_mode恢復cpsr。

使用儲存在lr_mode中的返回位址恢復程式計數器(pc)。

步驟1:可以通過使用資料處理指令實現從異常返回。

通過執行資料處理指令完成從異常的返回,這些資料處理指令要保證兩點:設定s標誌;目的暫存器為程式計數器。

所需的返回指令取決於異常的型別。有關如何從每種異常返回的問題將在後面的章節介紹。

備註:不必從復位處理程式返回,因為復位處理程式直接執行主**。

步驟2:使用出棧指令(載入指令)完成從異常返回。

處理異常時,如果異常處理程式入口**使用了堆來儲存必須保留的暫存器,可通過使用帶「^」的載入指令來從異常返回。例如使用:

ldmfd sp!,^

如果它將如下內容儲存在堆中:

呼叫處理程式時使用的所有暫存器。

為產生與下面說明的資料處理指令相同的效果而修改鏈結暫存器。

「^」修飾符指定將spsr的內容複製到cpsr中。僅在特權模式下使用。

3.從swi和未定義指令處理程式返回。

swi和未定義指令異常是由指令本身造成的,因此,處理異常時,程式計數器未被更新。處理器將(pc – 4)儲存在lr_ mode中。因而使lr_mode指向swi指令或是未定義指令後的下一條要執行的指令。要從lr中恢復程式計數器,則使用如下指令即可實現從異常返回:

movs pc, lr

stmfd sp!,

;...

ldmfd sp!,^

對於在thumb狀態下發生的異常,處理程式返回指令(movs pc,lr)將程式計數器指向下一條要執行指令的位址。這是在(pc – 2),因此處理器儲存在lr_mode中的值為 (pc – 2)。

4.從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)處的指令,所以返回指令為

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

對於普中斷和快中斷異常,中斷必須在一條指令執行完以後被檢測到,如正在

執行指令時發生了中斷,不等指令執行完是不會處理該中斷的,發生異常時 pc 已經

更新(a+12); lr = pc – 4即 a+8 返回後,應執行被

中斷而沒有執行的指令(上面的 a+4),所以返回時,pc = lr-4

5 從指令預取終止異常中斷處理程式返回

指令位址

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

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

a+8   pc

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

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

白話解釋:對於預取指令中止異常,發生預取指令異常時,是在執行時發生的異常,pc 

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

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

6 從資料訪問終止異常中斷處理程式返回

指令位址

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

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

a+8        pc        ;lr!

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

白話解釋:對於資料訪問中止異常,發生資料訪問中止異常時,是在執行時訪問資料錯誤

導致的異常,pc 已經更新,即 pc = a+12

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

ARM 異常中斷處理

在arm體系中,程式執行的流程有三種 要了解arm處理異常中斷的流程原理,就要先熟悉一下arm的工作模式與暫存器。如圖,arm有七種工作模式,大多數程式是工作在使用者模式usr下的,其他六種工作模式屬於特權模式,特權模式的存在是為了處理中斷 異常,或者訪問被保護的系統資源。不同模式之間的轉換可以通過...

ARM的異常中斷機制

在我們平時使用計算機時我們敲擊鍵盤,計算機會對我做出響應。這是什麼原因呢?處理器又是如何響應外圍請求的呢?其實這都是通過處理器的中斷機制實現的。arm又是怎樣的中斷機制?讓我們一起 吧 在arm處理器裡主要是通過3中情況在控制程式執行的 1.流水方式執行程式,pc的值是下一條指令的位址,即每執行一條...

跨區mv大檔案 異常中斷

隨便找了臺機子。或者在vmserver裡做測試,找乙個大檔案 root localhost apache2 du sh text 762m text root localhost apache2 mv text var root localhost apache2 du sh text 762m t...