RM新时代网站-首页

0
  • 聊天消息
  • 系統(tǒng)消息
  • 評(píng)論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會(huì)員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識(shí)你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

Linux內(nèi)核處理中斷的類型及過(guò)程

如意 ? 來(lái)源:Linux中國(guó) ? 作者:Stephan Avenwedde ? 2020-12-29 15:57 ? 次閱讀

中斷是計(jì)算機(jī)處理數(shù)據(jù)的關(guān)鍵部分。

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

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

定義

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

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

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

中斷的類型

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

硬件中斷

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

軟件中斷

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

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

異常

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

異常可以進(jìn)一步分為錯(cuò)誤Fault、陷阱Trap和終止Abort。

錯(cuò)誤:錯(cuò)誤是系統(tǒng)可以糾正的異常。例如當(dāng)一個(gè)進(jìn)程嘗試訪問(wèn)某個(gè)已經(jīng)被換出到硬盤的頁(yè)時(shí)。當(dāng)請(qǐng)求的地址在進(jìn)程的地址空間中,并且滿足訪問(wèn)權(quán)限時(shí),如果頁(yè)不在內(nèi)存(RAM)中,將會(huì)產(chǎn)生一個(gè)中斷請(qǐng)求(IRQ),并開始啟用缺頁(yè)異常處理程序把所需的頁(yè)加載到內(nèi)存中。如果操作成功執(zhí)行,程序?qū)⒗^續(xù)運(yùn)行。

陷阱:陷阱主要用在調(diào)試中。如果你在某個(gè)程序中設(shè)置了一個(gè)斷點(diǎn),你就插入了一條可以觸發(fā)陷阱執(zhí)行的特殊指令。陷阱可以觸發(fā)上下文切換來(lái)允許你的調(diào)試器讀取和展示局部變量的值。之后程序可以繼續(xù)運(yùn)行。陷阱同樣也是運(yùn)行系統(tǒng)調(diào)用的方式(如殺死一個(gè)進(jìn)程)

終止:終止是由系統(tǒng)表中的硬件錯(cuò)誤或值不一致而導(dǎo)致的。終止不會(huì)報(bào)告造成異常的指令的所在位置。這是最嚴(yán)重的中斷,終止將會(huì)調(diào)用系統(tǒng)的終止異常處理程序來(lái)結(jié)束造成異常的進(jìn)程。

動(dòng)手實(shí)踐

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

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

cat /proc/interrupts

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

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

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

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

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

如果要實(shí)時(shí)獲取該表,請(qǐng)運(yùn)行如下命令:

watch -n1 “cat /proc/interrupts”

總結(jié)

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

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

聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場(chǎng)。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問(wèn)題,請(qǐng)聯(lián)系本站處理。 舉報(bào)投訴
  • Linux
    +關(guān)注

    關(guān)注

    87

    文章

    11292

    瀏覽量

    209327
  • 操作系統(tǒng)
    +關(guān)注

    關(guān)注

    37

    文章

    6801

    瀏覽量

    123283
  • 中斷
    +關(guān)注

    關(guān)注

    5

    文章

    898

    瀏覽量

    41470
  • 異常
    +關(guān)注

    關(guān)注

    0

    文章

    22

    瀏覽量

    9223
收藏 人收藏

    評(píng)論

    相關(guān)推薦

    Linux內(nèi)核中斷設(shè)計(jì)與實(shí)現(xiàn)

    裸機(jī)編程中使用中斷比較麻煩,需要配置寄存器、使能IRQ等等。而在Linux驅(qū)動(dòng)編程中,內(nèi)核提供了完善的終端框架,只需要申請(qǐng)中斷,然后注冊(cè)中斷
    發(fā)表于 07-29 08:57 ?785次閱讀

    LINUX內(nèi)核網(wǎng)絡(luò)中的軟中斷KSOFTIRQD

    之前分享過(guò)Linux內(nèi)核網(wǎng)絡(luò)數(shù)據(jù)包的接收過(guò)程,當(dāng)執(zhí)行到網(wǎng)卡通過(guò)硬件中斷(IRQ)通知CPU,告訴它有數(shù)據(jù)來(lái)了,CPU會(huì)根據(jù)中斷表,調(diào)用已經(jīng)注
    發(fā)表于 12-15 11:44 ?1814次閱讀

    Linux內(nèi)核的編譯主要過(guò)程

    Linux內(nèi)核的編譯主要過(guò)程: 配置、編譯、安裝 。
    發(fā)表于 08-08 16:02 ?726次閱讀
    <b class='flag-5'>Linux</b><b class='flag-5'>內(nèi)核</b>的編譯主要<b class='flag-5'>過(guò)程</b>

    Linux內(nèi)核啟動(dòng)過(guò)程和Bootloader(總述)

    ,所以一般的 Bootloader 都會(huì)在執(zhí)行過(guò)程中初始化一個(gè)串口做為調(diào)試端口(3)檢測(cè)處理類型 Bootloader在調(diào)用 Linux內(nèi)核
    發(fā)表于 08-18 17:35

    Linux內(nèi)核自解壓過(guò)程

    Linux內(nèi)核的啟動(dòng)流程。有興趣的用戶可以參考其他書籍或資料進(jìn)行深入了解。  嵌入式linux內(nèi)核的啟動(dòng)全過(guò)程主要分為三個(gè)階段。第一階段為
    發(fā)表于 12-29 07:35

    Linux內(nèi)核啟動(dòng)全過(guò)程解析

    向量表和初始化中斷處理函數(shù);初始化系統(tǒng)核心進(jìn)程調(diào)度器和時(shí)鐘中斷處理機(jī)制;初始化串口控制臺(tái)(console_init);ARM-Linux
    發(fā)表于 10-26 17:20

    linux內(nèi)核啟動(dòng)內(nèi)核解壓過(guò)程分析

    linux啟動(dòng)時(shí)內(nèi)核解壓過(guò)程分析,一份不錯(cuò)的文檔,深入了解內(nèi)核必備
    發(fā)表于 03-09 13:39 ?1次下載

    Linux 2.4.x內(nèi)核中斷機(jī)制

    本文從Linux內(nèi)核幾種軟中斷機(jī)制相互關(guān)系和發(fā)展沿革入手,分析了這些機(jī)制的實(shí)現(xiàn)方法,給出了它們的基本用法。 軟中斷概況 軟中斷是利用硬件
    發(fā)表于 11-02 11:01 ?0次下載

    linux內(nèi)核中斷機(jī)制

    如果讓內(nèi)核定期對(duì)設(shè)備進(jìn)行輪詢,以便處理設(shè)備,那會(huì)做很多無(wú)用功,因?yàn)橥庠O(shè)的處理速度一般慢于CPU,而CPU不能一直等待外部事件。所以能讓設(shè)備在需要內(nèi)核時(shí)主動(dòng)通知
    發(fā)表于 11-14 15:48 ?3144次閱讀

    linux驅(qū)動(dòng)之中斷處理過(guò)程C程序部分

    linux內(nèi)核將所有的中斷統(tǒng)一編號(hào),使用一個(gè)irq_desc[NR_IRQS]的結(jié)構(gòu)體數(shù)組來(lái)描述這些中斷:每個(gè)數(shù)組項(xiàng)對(duì)應(yīng)著一個(gè)中斷源(可能是
    發(fā)表于 05-07 11:13 ?1035次閱讀

    Linux驅(qū)動(dòng)技術(shù)之一內(nèi)核中斷

    在硬件上,中斷源可以通過(guò)中斷控制器向CPU提交中斷,進(jìn)而引發(fā)中斷處理程序的執(zhí)行,不過(guò)這種硬件中斷
    發(fā)表于 05-08 13:49 ?642次閱讀

    需要了解的Linux的IRQ中斷子系統(tǒng)

    Linux中斷子系統(tǒng)(generic irq)出現(xiàn)之前,內(nèi)核使用__do_IRQ處理所有的中斷,這意味著__do_IRQ中要
    發(fā)表于 05-10 10:56 ?1473次閱讀

    Linux網(wǎng)絡(luò)包接收過(guò)程的監(jiān)控與調(diào)優(yōu)

    上一篇文章中《圖解Linux網(wǎng)絡(luò)包接收過(guò)程》,我們梳理了在Linux系統(tǒng)下一個(gè)數(shù)據(jù)包被接收的整個(gè)過(guò)程。Linux
    的頭像 發(fā)表于 11-10 14:50 ?1674次閱讀

    linux內(nèi)核-時(shí)鐘中斷

    在所有的外部中斷中,時(shí)鐘中斷起著特殊的作用,其作用遠(yuǎn)非單純的計(jì)時(shí)所能相比。當(dāng)然,即使是單純的計(jì)時(shí)也已經(jīng)足夠重要了。別的不說(shuō),沒(méi)有正確的時(shí)間關(guān)系,你用來(lái)重建內(nèi)核的工具make就不能正常運(yùn)行了,因?yàn)?/div>
    發(fā)表于 11-23 17:51 ?12次下載
    <b class='flag-5'>linux</b><b class='flag-5'>內(nèi)核</b>-時(shí)鐘<b class='flag-5'>中斷</b>

    Linux內(nèi)核SoftIrq源代碼分析

    我們?cè)诜治?b class='flag-5'>linux內(nèi)核中斷剖析時(shí),簡(jiǎn)單的聊了一下SOFTIRQ, 而沒(méi)有進(jìn)行深入分析. Linux內(nèi)核講對(duì)一個(gè)外部設(shè)備
    發(fā)表于 06-23 15:22 ?588次閱讀
    RM新时代网站-首页