第11章 異常相關指令的實現

2021-10-19 11:04:46 字數 2655 閱讀 5988

有些事件要打斷程式正常執行流程,這些事件有中斷,陷阱,系統呼叫以及其他任何可以打斷程式正常執行的情況,統稱為異常。

openmips只實現了對其中6中異常情況的處理:

**精確異常:**當乙個異常發生後,系統的順序執行會被中斷,此時有若干條指令處於流水線上的不同階段,處理器會轉移到異常處理例程,異常處理結束後返回原程式繼續執行,因為不希望異常處理例程破壞原程式的正常執行,所以對於異常發生時,流水線上沒有執行完的指令,必須記住它處於流水線的哪乙個階段,以便異常處理結束後能恢復執行,這便是精確異常。

**異常受害者:**對於乙個實現精確異常的處理器,在異常發生時,都會有乙個被異常打斷的指令,稱為異常受害者,該指令前面的所有指令都要被執行到流水線的最後乙個階段,也就是正常執行完成,但是該指令以及該指令後面的指令都要被取消,如圖11-1,第2條指令add在執行階段發生溢位異常,在這種情況下,已經到達訪存階段的第一條指令ori會繼續執行完成,而第2、3、4條指令都會被取消。

為了實現精確異常,必須要求發生異常的順序與指令的順序相同,如圖11-2,載入指令lw會在流水線的訪存階段發生位址未對齊的異常(因為載入位址是0x3,指令lw要求載入位址的最後兩位為00),該異常應該會在第4個時鐘週期發生,而它的後一條指令di是無效指令(mips32架構並沒有定義該指令,所以是無效指令),會在流水線解碼階段引發無效指令異常,也就是在第3個時鐘週期,而此時上一條載入指令lw還處在執行階段,沒有進入訪存階段,所以先發生異常的就是無效指令異常。從而不滿足異常發生的順序與指令的順序相同這一要求。

為了避免上述情況,先發生的異常並不立即處理,異常事件只是被標記,到達某個特殊的流水線階段才開始處理,比如在圖11-2中,雖然無效指令異常在解碼階段就發生了,但是此時只是標記異常,等到訪存階段時再處理異常,此時前乙個位址未對齊的異常已經被處理了,由此實現了按指令執行的順序處理異常,而不是按異常發生的順序處理異常。

當檢測到異常發生後,處理器會執行一系列動作以處理器異常,不同處理器的處理器的處理過程不同,openmips處理器的處理過程如下:

(1)檢測cp0中status暫存器的exl欄位,為1表示正在處理異常,如果當前發生的異常為中斷則不響應中斷,因為異常處理會禁止中斷,如果異常不是中斷,將異常原因儲存到cp0中的cause暫存器的exccode欄位,轉到步驟(4),如果exl為0,那麼將異常原因儲存到cp0中cause暫存器的exccode欄位,進入步驟(2)

(2)檢測發生異常的指令是否再延遲槽中,如果再延遲槽中,設定eipc暫存器的值為該指令的位址減4,同時設定cause暫存器的bd欄位為1,反之,設定epc暫存器的值就為該指令的位址,同時設定cause暫存器的bd欄位為0

(3)設定status暫存器的exl欄位為1,表示進入異常處理過程,禁止中斷。

(4)處理器轉移到實現定義好的乙個位址,在那個位址中往往有異常處理例程,在其中進行異常處理,這個位址稱為異常處理例程入口位址。

自陷指令有12條,按照指令中是否包含李技術,可以分為兩類

不包含立即數的自陷指令6條

包含立即數的自陷指令6條

11.4.2 系統呼叫指令syscall

指令作用是引發系統呼叫異常。mips32架構定義了處理器的兩種工作模式:使用者模式、核心模式,前一種是受限模式,喲些操作無法進行,大多用於使用者的應用程式,後者主要用於處理異常和具有優先權的作業系統函式,包括管理協處理器cp0和i/o等。使用者模式下的程式為了執行一些在核心模式下才能進行的操作,可以呼叫syscall指令,引發系統呼叫異常,進入異常處理例程,從而進入核心模式。

在流水線各個階段蒐集異常資訊,並傳遞到流水線訪存階段,在訪存階段同意處理異常資訊。流水線各個階段需要蒐集的異常資訊如下:

新增部分介面

修改pc模組

修改id模組

修改id/ex模組

修改ex模組

修改ex/mem模組

修改mem模組

修改mem/wb模組

中斷系統呼叫異常

無效指令異常

自陷異常

溢位異常

異常返回指令eret

c語言介面與實現 第11章序列理解

本章中強調序列是本書中最有用的adt abstact data type 之一,儘管序列的規格相對簡單,但可以用作陣列 鍊錶 棧 佇列和雙端佇列,實現這些資料結構的adt所需的設施通常都包含在序列中。前面這些基本是書中的原話,話不多說,上 seq.h ifndef seq included defi...

第9章 轉移指令的原理 筆記

p175 可以修改ip,或同事修改cs和ip的指令統稱為轉移指令。概括地講,轉移指令就是可以控制cpu執行記憶體中某處 的指令。8086cpu的轉移行為有以下幾類 只修改ip時,稱為段內轉移,比如 jmp ax 同時修改cs和ip時,稱為段間轉移,比如 jmp 1000 0 由於轉移指令對ip的修改...

第7章 自動丟擲異常的應用

public class systemexceptiontest public static void main string args 1.知識點分析 1 自動丟擲異常 由系統自動丟擲的異常稱為自動丟擲異常,即一旦出現某些執行錯誤時,系統將會為這些錯誤自動產生對應的異常類物件。2 對程式的分析 以...