# CH5 -- 中斷 > [name=卓楷倫] > [time=Tue, Jun 15, 2021 2:09 PM] ## 中斷 * **中斷(interrupt)**:暂停當前的程式,先執行中斷服務程式(ISR) > ISR是輕薄短小的程式,可在短時間内執行完畢待ISR執行完畢,再接續執行剛才暫停的程式。 > > **中斷風暴**:當中斷太頻繁時產生。 * **中斷時機**: 1. 當無法掌握I/O服務需求的時機,希望能即時處理I/O需求,又不耽誤原本的工作時。 2. 當I/O傳輸資料的速度較慢,希望能讓程式配合進行資料轉移時。 3. 當軟體執行時,發生意外(exceptions)狀況時。 4. 當硬體電路的意外狀況時。 5. 提醒CPU 處理固定時間的例行性動作。 > **中斷事件**:如電源不足的通知、印表機的處理、資料傳輸過程發生同位元檢查錯誤…等 ![](https://i.imgur.com/whjrTyU.png) > **中斷流程**:暫停當前的程式,先跳去ISR。ISR服務程式的最後一個指令是IRET,執行IRET指令,即可結束ISR,再返回到剛才暂停的程式並繼續執行之。 ![](https://i.imgur.com/AgMq1ir.png) > **優先度**:執行ISR1時,ISR1可被更高優先度的中斷請求(ISR2)給中斷。 ## 中斷種類 * 中斷種類大致上分為兩種: 1. **硬體中斷**:又稱為外部中斷。 2. **軟體中斷**:又稱為內部中斷,屬於 CPU 指令,用以自行產生中斷。 ### 硬體中斷 * **可遮罩中斷(maskable interrupt)**: 可在中斷遮罩暫存器(interrupt mask register)中設定遮罩位元,以關閉該中斷功能。 * **不可遮罩中斷(non-maskable interrupt, NMI)**: 無法在中斷遮罩暫存器中,設定遮罩位元來關閉。 * **微處理機間的中斷(interprocessor interrupt)**: 特殊的硬體中斷,由微處理機發出,被其他微處理機接收,作為微處理機間通信或同步之用。 * **偽中斷(spurious interrupt)**: 是不希望發生的硬體中斷,而發生的原因,可能是中斷線路上的信號異常、中斷請求裝置本身出問題等。 > **重置(RESET)**:屬於NMI的一種。 ### 軟體中斷 * CPU 執行狀態可分為: 1. **核心態(kernel mode)**: CPU 可以存取記憶體的所有資料,包括週邊裝置(如硬碟、網卡等),也可以在程式(函數)間切換。 2. **使用者態(user mode)**: 只能存取受限的記憶體,且不允許存取週邊裝置、不能搶占(preempty) CPU 等。 > 使用者程式是在使用者態下執行的,若程式裡需要執行在核心態才能做的動作(如存取硬碟資料等),則使用者程式必須向作業系統提出需求,以程式的名義來進行這些操作。 > > **系統呼叫(system call)**:使用者程式切換到核心態,但使用者程式不控制在核心態中執行的指令,稱為系統呼叫(system call),而在CPU裡實現,稱為**自陷(Trap)**指令 * **系統呼叫流程**: 1. 使用者態程式將資料放在暫存器,或使用引數建立一個堆疊,以此表明需要作業系統提供的服務。 2. 使用者態程式執行自陷指令,CPU切換到核心態,並跳到位於記憶體指定位置的指令,這些指令具有記憶體保護,無法被使用者態程式存取或執行。 3. 讀取程式放入記憶體的資料引數,並執行程式請求的服務。 4. 系統呼叫完成後,作業系統將CPU恢復為使用者態,並傳回系統呼叫的結果。 ### 精確中斷 * **精確中斷(precise interrupt)**:若中斷使微處理機處於確定狀態,稱為精確中斷。 * **確定狀態**: 1. 程式計數器的內容已被儲存在已知位置。 2. 程式計數器所指指令之前的所有指令,都已被執行完畢。 3. 程式計數器所指指令之後的指令,尚未被執行。 4. 在中斷信號出現後,開始執行 ISR 前,所對暫存器/記憶體的更改,都必須還原。 5. 程式計數器所指向的指令之執行狀態都已知。 ## 中斷風暴(interrupt storm) * **中斷風暴**:太過頻繁的中斷請求與回應,造成微處理機的效能降低。 ## 中斷指令 * **常見的中斷指令如下**: | 中斷指令 | 服務類別 | 功能 | | -------- | -------- | -------- | | INT 10 | 顯示器控制 | 可設定顯示模式的解析度、游標種類與位置、調色盤顏色等。| | INT 16 | 鍵盤控制 | 可讀取鍵盤輸入的字元、鍵盤的狀態等。| | INT 21 | 呼叫DOS函式 | 檔案的建立、刪除、讀取與寫入,設定、讀取系統日期與時間等。| | INT 33 | 滑鼠控制 | 設定、讀取滑鼠的狀態與游標的位置、範圍等。| ## 觸發信號 ### 準位觸發 * **高準位觸發**:未觸發時保持低態。 * **低準位觸發**:未觸發時保持高態。 ![](https://i.imgur.com/HHA9HGe.png) > 避免未確定狀態的發生:在觸發中斷線路設置電阻。 > **高準位觸發**:接地電阻。 > **低準位觸發**:提升電阻。 * **觸發信號後**: 1. 檢查每個共用裝置,以找到提出中斷請求的裝置,並處理之。 2. 處理完畢後,繼續偵測中斷線路,若仍為有效的觸發信號,則重複步驟 1 的操作。 > 以上步驟通常是優先檢查頻繁請求中斷的裝置,方能加快中斷處理,提升整體效能。 > > **週邊組件互連介面(PCI)**:其週邊裝置採用準位觸發中斷。 ### 邊緣觸發 為瞬間觸發信號,依中斷觸發信號脈波的邊緣,作為有效的中斷觸發信號,脈衝傳送完畢後,裝置立即釋放中斷線路,可分為: * **升緣觸發** * **降緣觸發** > 而中斷線路也要應用提升/接地電阻,以確定無中斷請求時的線路狀態。若多個裝置在接近的時間內傳送脈波,將會合併成單一個觸發信號。 > > **工業標準架構(Industry Standard Architecture, ISA)介面**:採用邊緣觸發中斷。 ### 混合模式觸發 * **不可遮罩中斷(NMI)**:大都與重要的系統異常事件相關,因此,NMI 大都使用混合模式,可有效減輕錯誤中斷或遺失中斷對系統影響。 ### 訊息信號觸發 * **訊息信號(message-signaled)觸發中斷**:並不直接偵測中斷線路,而是中斷裝置透過匯流排,傳送特定含義的訊息。 > 與處理邊緣觸發中斷類似,若兩個訊息相同,則可合併,包含訊息信號中斷向量(中斷服務程式的位址)也可以。 > **PCI Express(或 PCIe,為 PCI 的後續版本,改採串列式匯流排)**:採用訊息信號觸發。 ## 常見應用 * **系統時鐘應用計數器**:週期性地對微處理機提出中斷,而微處理機透過特定的時鐘ISR以保持計時。當時鐘中斷時,程式計數器會被自動壓入堆疊(PUSH、POP),並執行下一個行程(process)。 * **磁碟中斷**:標識某個磁碟裝置完成收發資料。 * **斷電中斷**:指示電腦即將斷電,而電腦可以相應中斷程式,依序進行關機動作。 ## 實例 ### 8086A微處理機 * **8086A**:16位元微處理機。 ![](https://i.imgur.com/SXjngf1.png) > **NMI 腳(17 腳)**:非可遮罩中斷接腳。 > **INTR 腳(18 腳)**:可遮罩中斷接腳,可與中斷控制器(如 8259A)相連,而中斷控制器再分別與週邊裝置的中斷請求接腳連接。 ```sequence 8259->CPU:INT to INTR CPU->8259:!INTA to !INTA ``` > **INTA 腳(QS1,24 腳)**:決定是否處理中斷,為0時處理。 ![](https://i.imgur.com/KDRVNBl.png) > 8086A 的 16 位元位址匯流排(配合 M/IO 腳與解碼器)及 8 位元資料匯流排,與 8259A 連接。 > > **8282**:栓鎖器。 > **8284**:時鐘脈波產生器。 > **8286**: 8 位元雙向緩衝器。 > **8288**:匯流排控制器。 ## 中斷向量表 * **中斷向量表(interrupt vector table, IVT)**: 在真實地址模式(real-address mode)中,是在記憶體位址空間中,最低的 1K 空間。 > 1K = 256*4 (256 個中斷向量,每個向量的長度為 4 Bytes) | 中斷編號 | 中斷源名稱 |中斷向量位址 | | -------- | -------- | -------- | | - |系統重置(Reset) |00h | |0 |第一個外部中斷 INT0 |03h | |1 |第一個計時計數器中斷 T0 |0Bh | |2 |第二個外部中斷 INT1 |13h | |3 |第二個計時計數器中斷 T1 |1Bh | |4 |串列埠中斷 RI/TI |23h | |5 |第三個計時計數器中斷(8052)T2/EXF2 |2Bh| * **中斷優先等級設定**: 8051/8052 提供簡單的中斷優先等級設定,可從其中斷優先等級(interrupt priority, IP)暫存器中,將指定的中斷項目設定為高優先等級。 ![](https://i.imgur.com/A58QndG.png) ## 優先等級 > 8051 系列單晶片微處理機的中斷優先等級,可在IP 暫存器設置。 * **中斷暫存/重啟**: 中斷 2 發生時,若微處理機正在執行與中斷 2 相同優先等級或更高優先等級的另一個中斷 1,則後來的中斷 2 將被暫存,直到前一個中斷 1 執行完畢,再重啟中斷 2,並執行之。 ![](https://i.imgur.com/rkii7yK.png) > **優先權**:中斷 1 > 中斷 2。 * **中斷嵌套(巢狀中斷**): 當高優先等級的中斷 2,打斷了低優先等級的中斷 1,形成中斷嵌套,就是巢狀中斷。 ![](https://i.imgur.com/J7iS5Q6.png) > **優先權**:中斷 2 > 中斷 1。 > > **優先等級**:通常硬體中斷的優先等級較軟體中斷的優先等級高,而 RESET 中斷又是硬體中斷裡,優先等級最高的(RESET > NMI > MI)。 ## CM3 中斷優先等級 ### 搶占優先等級 若中斷 A 的搶占優先等級高於中斷 B 的搶占優先等級,則中斷 A 都會搶占中斷 B,而不管其子優先等級與中斷編號為何。 ### 子優先等級 當 A、B 兩個中斷的搶占優先等級相同時,而中斷 A 的子優先等級高於中斷 B 的子優先等級時: * 當 A、B 兩個中斷同時發生或同時重啟時,優先執行 A 中斷 * 當中斷 A 發生時,正在執行中斷 B,則中斷 A 不會搶占中斷 B,而是被暫存。待中斷 B 執行完畢後,才接續執行中斷 A。 ### 中斷編號 * 兩個中斷的搶占優先等級和子優先等級都相同時,若兩個中斷同時發生,則根據中斷編號進行執行,中斷編號小的優先執行。 ## 中斷式資料傳輸 * 輸入資料:讀取週邊裝置資料到 CPU。 * 輸出資料:將 CPU 的資料寫入到週邊裝置。 * **輪詢式(polling) I/O**: 一直重複詢問週邊裝置的狀態,直到週邊裝置備妥,才能進一步存取動作。 * **中斷式(interrupt) I/O**: 若週邊裝置備妥後,由週邊裝置提出中斷請求,微處理機即暫停其工作,並執行週邊裝置的中斷請求。 ## 常用中斷控制器晶片 * **中斷控制器**:PIC 中斷控制器用來安排週邊裝置的中斷順序。 ![](https://i.imgur.com/CaSKNrp.png) 1. 若週邊裝置有存取請求,則透過中斷請求線路對中斷對控制器提出中斷請求 IRQ。 2. 中斷控制器接受所有週邊裝置提出的 IRQ,根據其優先等級,安排其執行順序。 3. 中斷控制器再透 INT 線,對微處理機提出中斷請求。 4. 待微處理機透過 INTA 線回應中斷控制器,該週邊裝置即可透過資料匯流排傳輸資料。 ### 8259A * **8259A** :Intel 公司針對 80 系列微處理機所設計的可程式中斷控制器(programmable interrupt controller, PIC)。 ![](https://i.imgur.com/YsGAkLw.png) > 8259A 適用於 8080、8085、8086、8088 等微處理機。 * **IR7~IR0 腳**:中斷請求輸入接腳,由週邊裝置連接進來。 * **D7~D0 腳**:資料匯流排,連接微處理機的資料匯流排。 * **CAS2~CAS0 腳**:8259A 之串接接腳,最多可串接 8 個 8259A,64(8*8)個中斷請求輸入。 * **A0**:位址匯流排裡的一支接腳,在此被用來控制之用。 * **INT 腳**:8259A 對微處理機提出中斷請求的接腳。 * **INTA 腳**:微處理機對 8259A 中斷請求的應答。 * **SP/EN 腳**:若在非緩衝器模式時,作為主從選擇之輸入;若在緩衝器模式時,作為緩衝器輸出致能信號。 * **CS腳**:晶片選擇接腳。 * **WR 腳**:寫入控制接腳。 * **RD 腳**:讀取控制接腳。 * **VCC 腳**:電源接腳,連接+5V。 * **GND 腳**:接地接腳。 > 預設的中斷請求優先順序為IR0>IR1>………>IR7 > !SP=0時為主 ; 反之為從。 ### 8259A 中斷式I/O 1. 週邊裝置向 8259A 發出中斷請求 ( 週邊裝置-> 8259A )。 2. 8259A 向 8086A 的 INTR 接腳傳送中斷信號( 8259A -> 8086A )。 3. 8086A 通過 INTA 接腳通知 8259A 中斷有效( 8086A -> 8259A ),這個過程包括對此 8259A 的定址。 4. 8259A 透過位址匯流排將對應接腳 n 的中斷類型碼傳送給 8086A( 8259A -> 8086A )。 5. 8086A 得到中斷類型碼後,先進行現場保護,主要包括: * 狀態旗標暫存器(FLAGS)壓入堆疊儲存之。 * 關閉中斷(將狀態旗標暫存器的 IF 旗標清除為 0)。 * 將目前程式碼段暫存器 CS 和程式計數器 IP 壓入堆疊儲存之。 6. 現場保護完成後,8086A 按照前述的兩步驟算出 ISR 之入口位址。 7. 得到 ISR 位址後,8086A 會再檢查 NMI 腳是否有信號,以防忽略了可能的 NMI 中斷。 8. ISR 將各暫存器之內容壓入堆疊儲存之(除了 IP 和 CS,此二暫存器現已指向目前中斷程式)。 9. 在 ISR 程式結束時,彈出(POP)堆疊內各暫存器的值。而 ISR 程式的最後指令為 IRET,此指令將堆疊上方 6 Bytes分別彈出,並存入 IP、CS 和 FLAGS 暫存器,以還原現場。 ### 8259A 中斷動作時序 ![](https://i.imgur.com/z62FCNw.png) 1. IR7~IR0 任一腳動作(低態),代表週邊裝置提出中斷請求,8259A將該中斷請求,儲存在中斷請求暫存器(Interrupt Request Register, IRR)的相對應位元。( 週邊裝置 -> 8259A ) 2. 8259A 隨判斷此中斷請求是否有效?若有效,隨即透過 INT 接腳向微處理機提出中斷請求(高態動作)。( 8259A -> 微處理機 ) 3. 微處理機收到 8259A 的 INT 信號後,隨即透過 INTA 腳回應,並在資料匯流排上送出三組資料(8080/8085)或一組資料(8086/8088)。( 微處理機 -> 8259A ) 8259A 收到 INTA 腳的回應後,隨即重置 IRR 中斷請求暫存器。 3. 微處理機送出第一組資料,即 CALL 指令碼。若是 8086/8088 模式時,仍為高阻抗。( 微處理機 -> 8259A ) 4. 若在 8080/8085 模式時,第二組資料為中斷服務程式位址的低八位元組。若在 8086/8088 模式時,第二組資料為中斷向量表的指位。( 微處理機 -> 8259A ) 6. 若在 8080/8085 模式時,第三組資料為中斷服務程式位址的高八位元組。若在 8086/8088 模式時,沒有第三組資料,仍為高阻抗。( 微處理機 -> 8259A ) ### MC6828 * **MC6828**:Motorola 公司針對 68 系列微處理機所設計的中斷優先等級。 ![](https://i.imgur.com/QzPAjzW.png) * **IN7~ IN0腳**:8 個週邊裝置的中斷請求輸入。 * **Stretch 腳**:與高速 CPU 連接的信號。 * **A4~A1**:位址匯流排。 * **Z4~Z1**:修改後的位址匯流排。 * **E、R/W、CS0、CS1接腳**:控制信號。 > 68系列微處理機與 80 系列微處理機其位址與編碼呈現相反的狀態。 ![](https://i.imgur.com/jwgEVBM.png) > MC6800 透過φ2、VMA、 R/W與 A15~A1 接腳來設定 MC6828 的中斷遮罩與中斷優先等級。 > A15~A5 必須全部為 1, CS0才會為 0。 > MC6800 的φ2、VMA、 R/W腳,連接到 MC6828 的 E、CS1、 R/W腳。 > MC6800 的 A4~A1 腳連接到 MC6828 的A4~A1 腳。 ## 彙總 1. 微處理機探知週邊裝置的需求,有**輪詢**與**中斷**兩種方式。 2. 中斷包括**硬體中斷**或**軟體中斷**,而根據進行中斷時的狀態,可分為**精確中斷**與**非精確中斷**。若中斷太過頻繁,將導致**中斷風暴** 3. 8086A 微處理機的 **NMI 腳為不可遮罩中斷接腳**,**INTR 腳為可遮罩中斷接腳** 4. 8086A 微處理機,在真實地址模式時,最低的 1K 空間(00000h 到 003FFh)。包括 **256 個中斷向量**,每個**向量的長度為 4 Bytes**,為中斷服務程式的入口地址。 5. 中斷嵌套就是巢狀中斷,也就是中斷之中,又有中斷。 6. **80 系列**微處理機之中斷,中斷向量表在記憶體的**最底部(由 0000h 開始)**,**中斷編號越小,優先等級越高**。 7. **68 系列**微處理機之中斷,中斷向量表在記憶體的**最頂部(由 FFFFh 開始)**,**中斷編號越小,優先等級越低**。 8. 8051/8052 系列單晶片微處理機可在其**中斷優先等級暫存器(IP)**,**設定中斷優先等級**。 9. **8259A** 是 Intel 公司**針對 80 系列微處理機所設計的可程式中斷控制器**,適用於 8080、8085、8086、8088 等微處理機。 10. 透過 **CAS2~CAS0 接腳**,最多可**串接 8 個 8259A**,**64 個中斷請求**輸入。