導讀:中斷是計算機處理數據的關鍵部分。
本文字數:2640,閱讀時長大約:4分鐘
https://linux.cn/article-12965-1.html
作者:Stephan Avenwedde
譯者:萌新阿巖
中斷是現代 CPU 工作方式中重要的部分。例如:當你每次在鍵盤上按下一個按鍵後,CPU 會被中斷以使得 PC 讀取用戶鍵盤的輸入。這個過程發生得相當快,以致於在使用體驗上你不會感到任何變化或損害。
此外,鍵盤並不是導致中斷的唯一組件。一般來說,有三種類型的事件會導致 CPU 發生中斷:硬件中斷、軟件中斷和異常。在具體介紹不同類型的中斷前,我需要先定義一些術語。
定義
中斷請求(interrupt request)(IRQ)是由可編程的中斷控制器(programmable interrupt controlle)(PIC)發起的,其目的是為了中斷 CPU 和執行中斷服務程序(interrupt service routine)(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 基金會的文章中找到更多相關信息:面向嵌入式開發者的實時 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 向量。
為了打印出在你的系統中已註冊的中斷,打開一個終端並輸入:
你應該會看到類似如下圖的結果:
內核版本為5.6.6中註冊的中斷 (Stephan Avenwedde,CC BY-SA 4.0)
從左到右各列的含義依次為:中斷向量號、每個 CPU(0~n)中斷髮生次數、硬件來源、硬件源通道信息、以及造成中斷請求的設備名。
在表的末尾,有一些非數字的中斷。它們是特定於體系結構的中斷,如本地計時器中斷(local timer interrupt)(LOC)的中斷請求(IRQ)號為 236。其中一些在 Linux 內核源樹中的Linux IRQ 向量佈局中指定。
特定於體系結構的中斷 (Stephan Avenwedde,CC BY-SA 4.0)
如果要實時獲取該表,請運行如下命令:
總結
正確的中斷請求(IRQ)處理對於硬件、驅動和軟件的正常交互是必要的。幸運地是,Linux 內核很好地完成了它,一個 PC 的普通用戶幾乎不會注意到內核的整個中斷處理過程。
中斷相當複雜,本文僅僅是一個關於中斷的概述。如果想要深入瞭解該主題可以閱讀Linux Inside 電子書(CC BY-NC-SA 4.0)和Linux 內核教程倉庫。
via:https://opensource.com/article/20/10/linux-kernel-interrupts
作者:Stephan Avenwedde選題:lujun9972譯者:萌新阿巖校對:wxy
本文由LCTT原創編譯,Linux中國榮譽推出
歡迎遵照 CC-BY-NC-SA 協議規定轉載,
如需轉載,請在文章下留言 “轉載:公眾號名稱”。
我們將為您添加白名單,授權“轉載文章時可以修改”,
可以修改版式,但不能修改文字和圖片內容。
轉載請超鏈接註明:頭條資訊 » Linux 內核如何處理中斷|Linux 中國
免責聲明 :非本網註明原創的信息,皆為程序自動獲取互聯網,目的在於傳遞更多信息,並不代表本網贊同其觀點和對其真實性負責;如此頁面有侵犯到您的權益,請給站長發送郵件,並提供相關證明(版權證明、身份證正反面、侵權鏈接),站長將在收到郵件24小時內刪除。