Linux 核心處理中斷全過程解析

大雄45發表於2021-01-12
導讀 中斷是現代 CPU 工作方式中重要的部分。例如:當你每次在鍵盤上按下一個按鍵後,CPU 會被中斷以使得 PC 讀取使用者鍵盤的輸入。這個過程發生得相當快,以致於在使用體驗上你不會感到任何變化或損害。

此外,鍵盤並不是導致中斷的唯一元件。一般來說,有三種型別的事件會導致 CPU 發生中斷:硬體中斷、軟體中斷和異常。在具體介紹不同型別的中斷前,我需要先定義一些術語。
Linux 核心處理中斷全過程解析Linux 核心處理中斷全過程解析

定義

中斷請求(IRQ)是由可程式設計的中斷控制器(PIC)發起的,其目的是為了中斷 CPU 和執行中斷服務程式(ISR)。中斷服務程式(ISR)是一個小的程式,用來處理具體的資料,其具體的處理方式依賴於造成中斷請求(IRQ)的原因。之前正在執行的程式在中斷服務程式(ISR)執行結束前都會被中斷。

在過去,中斷請求由單獨的晶片處理(中斷控制器晶片 PIC),I/O 裝置直接與中斷控制器(PIC)相連。中斷控制器(PIC)管理著多種硬體的中斷請求(IRQ),並且可以直接與 CPU 通訊。當一箇中斷請求(IRQ)產生後,中斷控制器(PIC)向 CPU 寫入資料,並且觸發中斷請求引腳(INTR)。

現如今,中斷請求(IRQ)由 CPU 中的高階可程式設計中斷控制器advanced programmable interrupt controller(APIC)部分來處理。每個核中都擁有屬於自己的高階可程式設計中斷控制器。

中斷的型別

正如我前文中提到的,中斷可以根據其來源分為三種型別。

硬體中斷

當一個硬體裝置想要告訴 CPU 某一需要處理的資料已經準備好後(例如:當鍵盤被按下或者一個資料包到了網路介面處),它將會傳送一箇中斷請求(IRQ)來告訴 CPU 資料是可用的。接下來會呼叫在核心啟動時裝置驅動註冊的對應的中斷服務程式(ISR)。

軟體中斷

當你在播放一個影片時,音訊和影片是同步播放是相當重要的,這樣音樂的速度才不會變化。這是由軟體中斷實現的,由精確的計時器系統(稱為 jiffies)重複發起的。這個計時器會使得你的音樂播放器同步。軟體中斷也可以被特殊的指令所呼叫,來讀取或寫入資料到硬體裝置。

當系統需要實時性時(例如在工業應用中),軟體中斷會變得重要。你可以在   基金會的文章中找到更多相關資訊:面向嵌入式開發者的實時 Linux 介紹。

異常

異常exception是你可能之前就知道的中斷型別。當 CPU 執行一些將會導致除零或缺頁錯誤的指令時,任何其他執行中的程式都會被中斷。在這種情況下,你會被一個彈窗提醒,或在控制檯輸出中看到**段錯誤segmentation fault(核心已轉儲core dumped)**。但並不是所有異常都是由指令錯誤引起的。

異常可以進一步分為錯誤Fault、陷阱Trap和終止Abort。

  • 錯誤:錯誤是系統可以糾正的異常。例如當一個程式嘗試訪問某個已經被換出到硬碟的頁時。當請求的地址在程式的地址空間中,並且滿足訪問許可權時,如果頁不在記憶體(RAM)中,將會產生一箇中斷請求(IRQ),並開始啟用 缺頁異常處理程式把所需的頁載入到記憶體中。如果操作成功執行,程式將繼續執行。
  • 陷阱:陷阱主要用在除錯中。如果你在某個程式中設定了一個斷點,你就插入了一條可以觸發陷阱執行的特殊指令。陷阱可以觸發上下文切換來允許你的偵錯程式讀取和展示區域性變數的值。之後程式可以繼續執行。陷阱同樣也是執行系統呼叫的方式(如殺死一個程式)
  • 終止:終止是由系統表中的硬體錯誤或值不一致而導致的。終止不會報告造成異常的指令的所在位置。這是最嚴重的中斷,終止將會呼叫系統的 終止異常處理程式來結束造成異常的程式。
動手實踐

中斷請求按照高階可程式設計中斷控制器(APIC)中的優先順序高低排序(0是最高優先順序)。前 32 箇中斷(0~31)是由 CPU 指定的固定序列。你可以在 OsDev 異常 頁面找到關於它們的概述。隨後的中斷請求可以以不同的方式進行分配。中斷描述表interrupt descriptor table(IDT)中記錄了中斷請求(IRQ)和中斷服務程式(ISR)的對應關係。Linux 中定義了從 0 到 256 的 IRQ 向量。

為了列印出在你的系統中已註冊的中斷,開啟一個終端並輸入:

cat /proc/interrupts

你應該會看到類似如下圖的結果:

Linux 核心處理中斷全過程解析Linux 核心處理中斷全過程解析

核心版本為5.6.6中註冊的中斷 (Stephan Avenwedde, CC BY-SA 4.0)

從左到右各列的含義依次為:中斷向量號、每個 CPU(0~n)中斷髮生次數、硬體來源、硬體源通道資訊、以及造成中斷請求的裝置名。

在表的末尾,有一些非數字的中斷。它們是特定於體系結構的中斷,如本地計時器中斷local timer interrupt(LOC)的中斷請求(IRQ)號為 236。其中一些在 Linux 核心源樹中的Linux IRQ 向量佈局中指定。

Linux 核心處理中斷全過程解析Linux 核心處理中斷全過程解析

特定於體系結構的中斷 (Stephan Avenwedde, CC BY-SA 4.0)

如果要實時獲取該表,請執行如下 :

watch -n1 "cat /proc/interrupts"
總結

正確的中斷請求(IRQ)處理對於硬體、驅動和軟體的正常互動是必要的。幸運地是,Linux 核心很好地完成了它,一個 PC 的普通使用者幾乎不會注意到核心的整個中斷處理過程。
中斷相當複雜,本文僅僅是一個關於中斷的概述。如果想要深入瞭解該主題可以閱讀 Linux Inside 電子書(CC BY-NC-SA 4.0)和 Linux 核心教程 倉庫。



來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/69955379/viewspace-2749309/,如需轉載,請註明出處,否則將追究法律責任。

相關文章