匯編語言簡易教程(14):中斷與恢復(fù)

匯編語言簡易教程(14):中斷與恢復(fù)

從一般意義上講,中斷是工作流的暫?;虮3?。 例如,如果您正在打電話,門鈴響了,則電話通話將處于暫停狀態(tài),門將應(yīng)答。 銷售人員被送走后,電話交談恢復(fù)(對話中斷的地方)

在計算機(jī)編程中,中斷也是當(dāng)前正在執(zhí)行的過程的暫?;虮3帧?通常,當(dāng)前進(jìn)程會中斷,以便可以執(zhí)行其他一些工作。 中斷通常被定義為改變處理器執(zhí)行的指令序列的事件。 此類事件對應(yīng)于軟件和/或硬件生成的信號。 例如,大多數(shù)輸入/輸出 (I/O) 設(shè)備都會生成中斷以傳輸或接收數(shù)據(jù)。 軟件程序還可以生成中斷,以根據(jù)需要啟動 I/O、請求操作系統(tǒng)服務(wù)或處理意外情況

處理中斷是一項敏感任務(wù)。 中斷可能隨時發(fā)生;內(nèi)核嘗試盡快解決中斷問題。 此外,一個中斷可以被另一個中斷中斷

多用戶操作系統(tǒng)

現(xiàn)代多用戶操作系統(tǒng) (OS) 支持多個程序同時執(zhí)行或似乎正在執(zhí)行,方法是根據(jù)需要共享資源。 操作系統(tǒng)負(fù)責(zé)管理和共享資源。 這些資源包括 CPU內(nèi)核、主內(nèi)存(即 RAM)、輔助存儲(即磁盤或 SSD)、顯示屏、鍵盤和鼠標(biāo)。 例如,多個程序必須共享可用的 CPU 資源(內(nèi)核或內(nèi)核,如適用)

當(dāng)中斷發(fā)生時,當(dāng)前進(jìn)程被中斷(即被擱置),中斷被處理(這取決于中斷的具體原因),然后最終恢復(fù)該進(jìn)程。 操作系統(tǒng)可以選擇在恢復(fù)原始進(jìn)程之前執(zhí)行其他任務(wù)或進(jìn)程。 中斷由稱為中斷服務(wù)例程(也稱為中斷處理程序、設(shè)備驅(qū)動程序等)的特殊軟件例程處理。 通過使用中斷并在各種進(jìn)程之間快速切換,操作系統(tǒng)能夠提供所有進(jìn)程同時執(zhí)行的錯覺。

并非所有代碼都可以中斷。 例如,由于某些操作系統(tǒng)內(nèi)核功能的性質(zhì),內(nèi)核中的某些區(qū)域完全不能中斷。 這包括更新一些敏感的操作系統(tǒng)數(shù)據(jù)結(jié)構(gòu)。

異步中斷

在計算機(jī)中斷的上下文中,異步發(fā)生的中斷意味著中斷可以在程序執(zhí)行的任意時間發(fā)生。

相對于執(zhí)行過程中的任何特定位置,異步中斷都是不可預(yù)測的。 例如,外部硬件設(shè)備可能會在不可預(yù)知的位置中斷當(dāng)前正在執(zhí)行的進(jìn)程。

同步中斷

同步發(fā)生的中斷通常發(fā)生在 CPU 控制下,并且由當(dāng)前正在執(zhí)行的進(jìn)程引起或代表當(dāng)前正在執(zhí)行的進(jìn)程。 同步性質(zhì)與中斷發(fā)生的位置有關(guān),而不是特定的時鐘時間或 CPU 周期時間。同步中斷通常在同一位置重復(fù)發(fā)生(假設(shè)沒有任何變化來解決原始原因

硬件中斷

硬件中斷通常由硬件生成。 硬件中斷可以由以下方式發(fā)出

  1. IO設(shè)備 (鍵盤 / 網(wǎng)卡)
  2. 間隔計時器
  3. 其他 CPU(在多處理器系統(tǒng)上)

硬件中斷是異步發(fā)生的。 硬件中斷的一個示例是在鍵盤上鍵入鍵時。 操作系統(tǒng)無法提前知道何時按下該鍵,甚至是否按下該鍵。 為了處理這種情況,鍵盤支持硬件將生成中斷。 如果操作系統(tǒng)正在執(zhí)行不相關(guān)的程序,則在處理密鑰時,該程序會暫時中斷。 在此示例中,該特定處理包括將密鑰存儲在緩沖區(qū)中并返回到中斷的進(jìn)程。 理想情況下,這種短暫的中斷對中斷的進(jìn)程影響不大

異常

異常是由當(dāng)前進(jìn)程引起并需要內(nèi)核注意的中斷的術(shù)語。 異常正在同步發(fā)生。 在這種情況下, synchronous 意味著異常將以可預(yù)測或可重復(fù)的方式發(fā)生, 通常分為以下:

  1. 故障 (faults)

一個例子是頁面錯誤,它是將部分程序從磁盤存儲加載到內(nèi)存中的請求。 中斷的進(jìn)程將重新啟動,而不會丟失連續(xù)性

  1. 陷阱 (Traps)

陷阱通常用于調(diào)試。 該過程將重新啟動,而不會失去連續(xù)性。

  1. 中止 (Abort)

中止通常表示發(fā)生了嚴(yán)重的錯誤情況,必須加以處理。 這包括除以零、嘗試訪問無效的內(nèi)存地址或嘗試執(zhí)行無效/非法指令。 非法指令可能是只允許由特權(quán)/授權(quán)進(jìn)程執(zhí)行的指令

軟件中斷

CPU 在處理指令時會產(chǎn)生軟件中斷。 這通常是程序員明確請求的編程異常。

此類中斷通常是同步發(fā)生的,通常用于從操作系統(tǒng)請求系統(tǒng)服務(wù)。 例如,請求 I/O 等系統(tǒng)服務(wù)

中斷類型及等級

中斷具有與之關(guān)聯(lián)的各種類型和權(quán)限。

以下各節(jié)提供了類型和權(quán)限的說明。 中斷的進(jìn)程可能以低于中斷處理代碼的權(quán)限執(zhí)行。 為了使中斷有效,操作系統(tǒng)必須安全、快速地處理此權(quán)限提升和降級。

類型區(qū)分

  1. 可屏蔽中斷
  2. 不可屏蔽中斷

可屏蔽中斷通常由 I/O 設(shè)備發(fā)出。 顧名思義,“可屏蔽”意味著,可在短時間內(nèi)忽略或屏蔽可屏蔽的中斷。 這允許延遲關(guān)聯(lián)的中斷處理

不可屏蔽中斷 (NMI)。 這包括一些操作系統(tǒng)功能和嚴(yán)重故障,例如硬件故障。 不可屏蔽的中斷始終由 CPU 處理。

權(quán)限級別

權(quán)限級別是指執(zhí)行中斷代碼的權(quán)限級別。 這可能是比中斷的代碼正在執(zhí)行的更高的權(quán)限級別。 處理器以四個權(quán)限級別之一執(zhí)行代碼,如下所示

中斷處理

處理中斷時,必須安全、迅速且正確地進(jìn)行處理?;舅枷胧?,當(dāng)當(dāng)前正在執(zhí)行的過程被中斷時,必須將其暫停,并找到并執(zhí)行相應(yīng)的中斷處理代碼。所需的具體中斷處理取決于中斷的原因或目的。一旦服務(wù)了中斷,最終將恢復(fù)原始過程的執(zhí)行。

中斷服務(wù)例程(ISR)

響應(yīng)中斷執(zhí)行的代碼通常被稱為中斷服務(wù)例程或ISR。這段代碼有時被稱為中斷處理器、處理器、服務(wù)例程或ISR代碼。為了一致性,本文檔將使用ISR這個術(shù)語。

由于并發(fā)和競態(tài)條件相關(guān)的問題,ISR代碼的開發(fā)具有挑戰(zhàn)性。此外,隔離問題和調(diào)試ISR代碼也很困難。

處理步驟

處理中斷涉及的一般步驟在以下各節(jié)中概述。

暫停

當(dāng)前程序的執(zhí)行被暫停。至少需要將rip和rFlags寄存器保存到系統(tǒng)棧。其余寄存器可能會被保留(作為進(jìn)一步的步驟),這取決于具體的中斷。rFlags標(biāo)志寄存器必須立即保留,因為中斷可能是異步生成的,且這些寄存器會隨著連續(xù)指令的執(zhí)行而改變。這個多階段過程確保程序上下文可以完全恢復(fù)。

獲取ISR地址

ISR地址存儲在一個稱為中斷描述符表(IDT)的表中。對于每個ISR,IDT包含ISR地址和一些附加信息,包括ISR的任務(wù)門(優(yōu)先級和權(quán)限信息)。IDT中的每個條目總共有8字節(jié),每個IDT條目有16字節(jié)。IDT中最多可能有256(0-255)個條目。

要獲取ISR的起始地址,中斷號乘以16(因為每個條目是16字節(jié)),這個值用作IDT中的偏移量,從中獲得ISR地址(對于該中斷)。

IDT的起始位置由一個專用寄存器IDTR指向,該寄存器僅可由操作系統(tǒng)訪問,并且需要0級權(quán)限才能訪問。

ISR例程的地址特定于操作系統(tǒng)版本和系統(tǒng)的特定硬件組合。系統(tǒng)最初啟動時創(chuàng)建IDT,并反映特定的系統(tǒng)配置。這對于操作系統(tǒng)能夠在不同的系統(tǒng)硬件配置上正確且一致地工作至關(guān)重要。

跳轉(zhuǎn)到ISR

從IDT獲取ISR地址后,會執(zhí)行一些驗證。這包括確保中斷來自合法/有效的源,以及是否需要和允許更改權(quán)限級別。一旦驗證成功完成,ISR的地址從IDT放入rip寄存器,從而實現(xiàn)跳轉(zhuǎn)到ISR例程。

暫停執(zhí)行ISR

此時,根據(jù)特定ISR,可能會執(zhí)行完整的進(jìn)程上下文切換。進(jìn)程上下文切換涉及保存中斷進(jìn)程的所有CPU寄存器。

在基于Linux的操作系統(tǒng)中,ISR通常分為兩部分,稱為上半部和下半部。其他操作系統(tǒng)將這些稱為一級中斷處理器(FLIH)和二級中斷處理器(SLIH)。

上半部或FLIH立即執(zhí)行,且在此進(jìn)行任何關(guān)鍵活動。這些活動特定于ISR,但可能包括確認(rèn)中斷、重置硬件(如必要)以及記錄只在中斷時刻可用的任何信息。上半部可能會執(zhí)行一些阻塞其他中斷的操作(這需要盡量減少)。

下半部是執(zhí)行任何處理活動的地方(如果有的話)。這有助于確保上半部快速完成,并將任何非關(guān)鍵處理推遲到更方便的時間。如果存在下半部,上半部將創(chuàng)建并安排執(zhí)行下半部。

一旦上半部完成,操作系統(tǒng)調(diào)度器將選擇一個新的進(jìn)程。

恢復(fù)

當(dāng)操作系統(tǒng)準(zhǔn)備恢復(fù)中斷的進(jìn)程時,將恢復(fù)程序上下文,并執(zhí)行iret指令(以彈出rFlags和rip寄存器,從而完成恢復(fù))。

示意圖

  1. 執(zhí)行當(dāng)前程序暫停 (Execution of current program is suspended) :
  • 當(dāng)前正在執(zhí)行的程序被暫停,系統(tǒng)將 rip(指令指針寄存器)和 rFlags(標(biāo)志寄存器)保存到棧中。
  1. 獲取中斷服務(wù)例程的起始地址 (Obtain starting address of Interrupt Service Routine (ISR)) :
  • 使用中斷號乘以16,這個結(jié)果用作中斷描述符表(IDT)的偏移量。
  • 從IDT中獲取該中斷的ISR地址。
  1. 跳轉(zhuǎn)到中斷服務(wù)例程 (Jump to Interrupt Service Routine) :
  • rip 設(shè)置為從IDT中獲取的地址,這樣就實現(xiàn)了對ISR的跳轉(zhuǎn)。
  1. 中斷服務(wù)例程執(zhí)行 (Interrupt Service Routine Executes) :
  • 保存上下文(即,保存所有被改變的附加寄存器)。
  • 處理中斷(具體操作取決于生成的中斷類型)。
  • 安排任何后續(xù)的數(shù)據(jù)處理活動。
  1. 中斷進(jìn)程恢復(fù) (Interrupted Process Resumption) :
  • 根據(jù)操作系統(tǒng)的調(diào)度器恢復(fù)調(diào)度。
  • 恢復(fù)之前保存的上下文。
  • 執(zhí)行 iret 指令,從棧中彈出 rFlagsrip 寄存器,完成恢復(fù)過程。

這種中斷處理機(jī)制允許動態(tài)地、在運行時查找ISR地址。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容