<kbd id="afajh"><form id="afajh"></form></kbd>
<strong id="afajh"><dl id="afajh"></dl></strong>
    <del id="afajh"><form id="afajh"></form></del>
        1. <th id="afajh"><progress id="afajh"></progress></th>
          <b id="afajh"><abbr id="afajh"></abbr></b>
          <th id="afajh"><progress id="afajh"></progress></th>

          Linux 內(nèi)核如何處理中斷 | Linux 中國

          共 2828字,需瀏覽 6分鐘

           ·

          2021-02-06 10:24


          中斷是現(xiàn)代 CPU 工作方式中重要的部分。例如:當你每次在鍵盤上按下一個按鍵后,CPU 會被中斷以使得 PC 讀取用戶鍵盤的輸入。這個過程發(fā)生得相當快,以致于在使用體驗上你不會感到任何變化或損害。

          此外,鍵盤并不是導致中斷的唯一組件。一般來說,有三種類型的事件會導致 CPU 發(fā)生中斷:硬件中斷、軟件中斷和異常。在具體介紹不同類型的中斷前,我需要先定義一些術(shù)語。

          定義

          中斷請求(interrupt request)(IRQ)是由可編程的中斷控制器(programmable interrupt controlle)(PIC)發(fā)起的,其目的是為了中斷 CPU 和執(zhí)行中斷服務(wù)程序(interrupt service routine)(ISR)。中斷服務(wù)程序(ISR)是一個小的程序,用來處理具體的數(shù)據(jù),其具體的處理方式依賴于造成中斷請求(IRQ)的原因。之前正在運行的進程在中斷服務(wù)程序(ISR)運行結(jié)束前都會被中斷。

          在過去,中斷請求由單獨的芯片處理(中斷控制器芯片 PIC),I/O 設(shè)備直接與中斷控制器(PIC)相連。中斷控制器(PIC)管理著多種硬件的中斷請求(IRQ),并且可以直接與 CPU 通信。當一個中斷請求(IRQ)產(chǎn)生后,中斷控制器(PIC)向 CPU 寫入數(shù)據(jù),并且觸發(fā)中斷請求引腳(INTR)。

          現(xiàn)如今,中斷請求(IRQ)由 CPU 中的高級可編程中斷控制器(advanced programmable interrupt controller)(APIC)部分來處理。每個核中都擁有屬于自己的高級可編程中斷控制器。

          中斷的類型

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

          硬件中斷

          當一個硬件設(shè)備想要告訴 CPU 某一需要處理的數(shù)據(jù)已經(jīng)準備好后(例如:當鍵盤被按下或者一個數(shù)據(jù)包到了網(wǎng)絡(luò)接口處),它將會發(fā)送一個中斷請求(IRQ)來告訴 CPU 數(shù)據(jù)是可用的。接下來會調(diào)用在內(nèi)核啟動時設(shè)備驅(qū)動注冊的對應(yīng)的中斷服務(wù)程序(ISR)。

          軟件中斷

          當你在播放一個視頻時,音頻和視頻是同步播放是相當重要的,這樣音樂的速度才不會變化。這是由軟件中斷實現(xiàn)的,由精確的計時器系統(tǒng)(稱為?jiffies)重復發(fā)起的。這個計時器會使得你的音樂播放器同步。軟件中斷也可以被特殊的指令所調(diào)用,來讀取或?qū)懭霐?shù)據(jù)到硬件設(shè)備。

          當系統(tǒng)需要實時性時(例如在工業(yè)應(yīng)用中),軟件中斷會變得重要。你可以在 Linux 基金會的文章中找到更多相關(guān)信息:面向嵌入式開發(fā)者的實時 Linux 介紹。

          異常

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

          異常可以進一步分為錯誤(Fault)陷阱(Trap)終止(Abort)

          ??錯誤:錯誤是系統(tǒng)可以糾正的異常。例如當一個進程嘗試訪問某個已經(jīng)被換出到硬盤的頁時。當請求的地址在進程的地址空間中,并且滿足訪問權(quán)限時,如果頁不在內(nèi)存(RAM)中,將會產(chǎn)生一個中斷請求(IRQ),并開始啟用缺頁異常處理程序把所需的頁加載到內(nèi)存中。如果操作成功執(zhí)行,程序?qū)⒗^續(xù)運行。
          ??陷阱:陷阱主要用在調(diào)試中。如果你在某個程序中設(shè)置了一個斷點,你就插入了一條可以觸發(fā)陷阱執(zhí)行的特殊指令。陷阱可以觸發(fā)上下文切換來允許你的調(diào)試器讀取和展示局部變量的值。之后程序可以繼續(xù)運行。陷阱同樣也是運行系統(tǒng)調(diào)用的方式(如殺死一個進程)
          ??終止:終止是由系統(tǒng)表中的硬件錯誤或值不一致而導致的。終止不會報告造成異常的指令的所在位置。這是最嚴重的中斷,終止將會調(diào)用系統(tǒng)的終止異常處理程序來結(jié)束造成異常的進程。

          動手實踐

          中斷請求按照高級可編程中斷控制器(APIC)中的優(yōu)先級高低排序(0是最高優(yōu)先級)。前 32 個中斷(0~31)是由 CPU 指定的固定序列。你可以在?OsDev 異常?頁面找到關(guān)于它們的概述。隨后的中斷請求可以以不同的方式進行分配。中斷描述表(interrupt descriptor table)(IDT)中記錄了中斷請求(IRQ)和中斷服務(wù)程序(ISR)的對應(yīng)關(guān)系。Linux 中定義了從 0 到 256 的 IRQ 向量。

          為了打印出在你的系統(tǒng)中已注冊的中斷,打開一個終端并輸入:

          1. cat/proc/interrupts

          你應(yīng)該會看到類似如下圖的結(jié)果:

          內(nèi)核版本為5.6.6中注冊的中斷?(Stephan Avenwedde,?CC BY-SA 4.0)

          從左到右各列的含義依次為:中斷向量號、每個 CPU(0~n)中斷發(fā)生次數(shù)、硬件來源、硬件源通道信息、以及造成中斷請求的設(shè)備名。

          在表的末尾,有一些非數(shù)字的中斷。它們是特定于體系結(jié)構(gòu)的中斷,如本地計時器中斷(local timer interrupt)(LOC)的中斷請求(IRQ)號為 236。其中一些在 Linux 內(nèi)核源樹中的Linux IRQ 向量布局中指定。

          特定于體系結(jié)構(gòu)的中斷 (Stephan Avenwedde,?CC BY-SA 4.0)

          如果要實時獲取該表,請運行如下命令:

          1. watch-n1 "cat /proc/interrupts"

          總結(jié)

          正確的中斷請求(IRQ)處理對于硬件、驅(qū)動和軟件的正常交互是必要的。幸運地是,Linux 內(nèi)核很好地完成了它,一個 PC 的普通用戶幾乎不會注意到內(nèi)核的整個中斷處理過程。

          中斷相當復雜,本文僅僅是一個關(guān)于中斷的概述。如果想要深入了解該主題可以閱讀?Linux Inside 電子書(CC BY-NC-SA 4.0)和?Linux 內(nèi)核教程?倉庫。


          via:?https://opensource.com/article/20/10/linux-kernel-interrupts

          作者:Stephan Avenwedde?選題:lujun9972?譯者:萌新阿巖?校對:wxy

          本文由?LCTT?原創(chuàng)編譯,Linux中國?榮譽推出


          良許個人微信


          添加良許個人微信即送3套程序員必讀資料


          → 精選技術(shù)資料共享

          → 高手如云交流社群





          本公眾號全部博文已整理成一個目錄,請在公眾號里回復「m」獲取!

          推薦閱讀:

          用自己訓練的AI玩王者榮耀是什么體驗?

          良許搞了一個副業(yè)社群!

          給代碼寫注釋時有哪些講究?


          5T技術(shù)資源大放送!包括但不限于:C/C++,Linux,Python,Java,PHP,人工智能,單片機,樹莓派,等等。在公眾號內(nèi)回復「1024」,即可免費獲取!!


          瀏覽 39
          點贊
          評論
          收藏
          分享

          手機掃一掃分享

          分享
          舉報
          評論
          圖片
          表情
          推薦
          點贊
          評論
          收藏
          分享

          手機掃一掃分享

          分享
          舉報
          <kbd id="afajh"><form id="afajh"></form></kbd>
          <strong id="afajh"><dl id="afajh"></dl></strong>
            <del id="afajh"><form id="afajh"></form></del>
                1. <th id="afajh"><progress id="afajh"></progress></th>
                  <b id="afajh"><abbr id="afajh"></abbr></b>
                  <th id="afajh"><progress id="afajh"></progress></th>
                  青青草无码在线观看 | 日日于夜夜操免费视频 | 国产精品秘 久久久久久电影院 | 日韩中文字幕无码中字字幕 | 美女扒开粉嫩的尿囗给男生桶 |