您好,登錄后才能下訂單哦!
這篇文章主要介紹了Linux內(nèi)核中斷的示例分析,具有一定借鑒價(jià)值,感興趣的朋友可以參考下,希望大家閱讀完這篇文章之后大有收獲,下面讓小編帶著大家一起了解一下。
中斷是指在CPU正常運(yùn)行期間,由于內(nèi)外部事件或由程序預(yù)先安排的事件引起的CPU暫時(shí)停止正在運(yùn)行的程序,轉(zhuǎn)而為該內(nèi)部或外部事件或預(yù)先安排的事件服務(wù)的程序中去,服務(wù)完畢后再返回去繼續(xù)運(yùn)行被暫時(shí)中斷的程序。
定義
中斷請(qǐng)求(IRQ)是由可編程的中斷控制器(PIC)發(fā)起的,其目的是為了中斷 CPU 和執(zhí)行中斷服務(wù)程序(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 寫(xiě)入數(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)鍵盤(pán)被按下或者一個(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)信息:面向嵌入式開(kāi)發(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ò)誤引起的。
異??梢赃M(jìn)一步分為錯(cuò)誤Fault、陷阱Trap和終止Abort。
動(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è)的中斷,打開(kāi)一個(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)核源樹(shù)中的Linux IRQ 向量布局中指定。
特定于體系結(jié)構(gòu)的中斷 (Stephan Avenwedde, CC BY-SA 4.0)
如果要實(shí)時(shí)獲取該表,請(qǐng)運(yùn)行如下命令:
watch -n1 "cat /proc/interrupts"
感謝你能夠認(rèn)真閱讀完這篇文章,希望小編分享的“Linux內(nèi)核中斷的示例分析”這篇文章對(duì)大家有幫助,同時(shí)也希望大家多多支持億速云,關(guān)注億速云行業(yè)資訊頻道,更多相關(guān)知識(shí)等著你來(lái)學(xué)習(xí)!
免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。