【軟體開發底層知識修煉】二 深入淺出處理器之二 中斷的概念與意義

楊柳_發表於2019-01-23

學習交流加

  • 個人qq: 1126137994
  • 個人微信: liu1126137994
  • 學習交流資源分享qq群: 962535112

本篇文章我們學習中斷的概念與意義。本片文章只學習中斷概念與意義,並不深入研究中斷向量表與ISR中斷服務程式的實現。同時本片文章講解一個與中斷有關的應用:斷點除錯。當然具體的斷點除錯方法會在後面講解,本次只是說明中斷在斷點除錯中的應用。

1、中斷的概念與意義

1.2、 中斷的概念

  • 中斷是一種處理器與外設進行通訊的機制(在我們學習了訊號機制,會發現不一定是與外設之間)
  • 外設通過產生中斷,向處理器告知,外部有重要事件發生
  • 處理器收到中斷後,需要響應中斷(具體如何響應見後面內容)

上面只是中斷的簡單概念。舉個例子,我們點選滑鼠的時候,滑鼠這個外設會產生一箇中斷,當CPU收到這個中斷的時候,CPU會響應這個中斷,進而執行ISR(中斷服務程式),在中斷服務程式中肯定會呼叫滑鼠的驅動模組,從而在電腦上我們才能看到滑鼠的點選效果。

那麼什麼是中斷服務程式呢(ISR)?

  1. 首先中斷服務程式會從外設中讀取外設的中斷暫存器,從而獲得中斷的型別
  2. 然後根據中斷型別,設計具體的處理邏輯(後面的學習中我們會發現實際上是通過中斷向量表來選取具體的處理邏輯)
  3. 中斷處理完畢後,還需要清除外設中的中斷暫存器內容
  4. 然後清除CPU中的中斷標識位
  5. 最後還需要恢復CPU中本該執行的指令

下面看一個圖示來表示一箇中斷產生的過程:

在這裡插入圖片描述

  • 步驟一外設產生中斷
  • 步驟二要先把當前正在執行的程式的上下文儲存(比如通用暫存器的值)
  • 步驟三四讀取外設中斷暫存器的值,獲得中斷型別
  • 步驟五執行相應的中斷處理程式
  • 步驟六清除外設的中斷暫存器的值
  • 步驟七清除CPU的中斷標識位
  • 步驟八恢復當前需要執行程式的上下文環境

那麼,從程式的角度來考慮,中斷服務程式(ISR)有哪些特徵呢?

我們知道,中斷服務程式執行完之後,需要再次回到之前的程式繼續執行,所以ISR不能有返回值(想一想你有返回值得到話,誰來接收這個返回值呢?),並且,沒有引數傳遞!因為前期已經通斷中斷向量表來選取了特定型別的處理邏輯,此處無需再讓中斷的型別當做引數傳遞來決定如何設計處理邏輯,所以無需引數。同時,對於這種打斷程式執行的,比如後面的訊號,程式最好不要太長,容易產生錯誤。所以ISR最好短小精悍,為了能夠快速結束,最好少做浮點運算。

  • 不能有返回值,不能有引數傳遞
  • 儘量短小高效,避免浮點運算

1.2、中斷的意義

  • 應用程式不必關心中斷的處理與發生
  • 中斷服務程式也不用關心應用程式的狀態
  • 中斷是上層應用與底層程式碼的分界線
    在這裡插入圖片描述

1.3、中斷的型別

  • 硬中斷

    • 通過處理器的中斷訊號線產生的中斷(滑鼠按一下產生的中斷,通過中斷訊號線傳送給處理器)
  • 軟中斷

    • 通過非法指令或者特殊指令陷入的中斷(比如系統呼叫也是一種軟中斷,它就是通過特殊指令Int 0x80陷入核心,也可以看做一種中斷。再比如後面會學習的訊號,也是一種中斷)

1.4、中斷的優先順序

比如此時有好幾個中斷訊號產生,比如你的電腦正在執行微博程式,你點選滑鼠,立馬有反應,這說明什麼?說明滑鼠的優先順序比微博程式的優先順序高。其實,任何ISR的優先順序,都比應用程式的優先順序高。而中斷中,也分為不同的優先順序,高優先順序的中斷會優先得到CPU的處理,且一箇中斷ISR在執行時,如果再來一個比它優先順序高的中斷,這個高優先順序的中斷會打斷那個正在執行的中斷程式。

  • 中斷優先順序

    1. 多箇中斷同時出現時,處理器優先響應高優先順序的中斷
    2. 低優先順序中斷的ISR執行時,可以被高優先順序的中斷再次打斷
    3. ISR比上層應用程式的優先順序都高

2、中斷的應用-斷點除錯

2.2、什麼是程式的斷點?

大家都知道斷點除錯。程式的斷點,其實就是一個指令的地址。這個指令的地址,是除錯工具(例如GDB)讓程式碼停止執行時候的位置。當你設定斷點後,程式會在你設定的斷點處停止執行。然後去執行你的除錯工具裡面的相應程式,那麼接下來你就可以使用除錯工具來獲取程式的相應資訊,比如上下文環境,棧資訊等

2.2、 程式斷點的實現原理

程式斷點的實現原理,依賴於CPU的中斷機制。包括CPU的硬中斷機制與軟中斷機制。

說的通俗一點,就是將斷點處的指令替換為中斷觸發指令,不再繼續執行當前程式,而是去執行中斷服務程式ISR,然後ISR再將CPU控制權交給你的除錯工具的處理程式。

  • 程式斷點的實現原理

    1. 獲取源程式指定行對應的程式碼地址(指令地址)
    2. 儲存當前程式的上下文環境資訊
    3. 把該指令地址處的指令,替換為中斷觸發指令
    4. 在中斷服務程式ISR中將CPU控制權交給除錯工具的處理程式
    5. 除錯程式開始做相應處理(比如可以讀取源程式的上下文資訊或者棧資訊)
    6. 除錯程式處理完後,將之前指令地址處的指令還原
    7. 恢復之前程式的上下文資訊
    8. 源程式繼續從斷點處執行程式

下面來看一張圖理解斷點的實現原理

在這裡插入圖片描述

其中中斷觸發指令,被CPU執行後,OS會向除錯程式傳送signal,signal後面會講。除錯程式收到signal,會執行響應的處理函式handle。

以上只是大致講原理,沒有深入研究原始碼。

3、總結

本篇文章要學會:

  • 中斷的概念與意義
  • 中斷的型別(硬中斷與軟中斷)
  • 中斷的應用-斷點與斷點的實現原理

相關文章