8.4-中断系统
【README】
1.本文總結自bilibili《計算機組成原理(哈工大劉宏偉)》的視頻講解,非常棒,墻裂推薦;
2.采用一問一答的方式對中斷進行總結(中斷7問題),refer2
8.4-中斷系統小結(cpu響應中斷)_PacosonSWJTU的博客-CSDN博客_cpu響應中斷的步驟【README】本文轉自bilibili《計算機組成原理(哈工大劉宏偉)》的視頻講解,非常棒,墻裂推薦;【1】中斷系統1)作用:用中斷系統實現了外設數據的輸入輸出; 還可以用于程序調試,計算機系統的異常事件,都可以用中斷系統來處理;2)中斷因素人為設置的中斷;程序性事故,如java異常;硬件故障,如硬盤壞道;Io設備,如數據輸入輸出;外部事件,如鍵盤中斷按鈕,調試程序;3)中斷系統需要解決的問題序號問題1https://blog.csdn.net/PacosonSWJTU/article/details/1235392163.本文首先給出中斷全流程:
【1】概述
【1.1】引起中斷的各種因素
0)中斷系統作用:
第5章,我們用中斷系統實現了數據的輸入輸出上;還可以用于程序調試,計算機系統的異常事件,都可以用中斷系統來處理;
1)引起中斷的各種因素
【1.2】中斷系統需解決的問題
| 序號 | 問題 |
| 1 | 各中斷源如何向cpu提出請求? |
| 2 | 各中斷源同時提出請求,怎么辦? |
| 3 | Cpu在什么條件,什么時間,以什么方式響應中斷? |
| 4 | 如何保護現場 |
| 5 | 如何尋找入口地址? |
| 6 | 如何恢復現場,如何返回? |
| 7 | 處理中斷的過程中又出現新的中斷 怎么辦? |
【2】中斷請求標記和中斷判優邏輯
【2.1】中斷請求標記
?【問題1】多個中斷源如何提出中斷請求?
給每一個中斷源設置一個觸發器,用觸發器來標記這個中斷源是否提出了中斷請求;
(一個中斷源對應一個中斷請求觸發器INTR)多個觸發器組成了中斷請求標記寄存器;
中斷觸發器可以做在中斷源的接口電路,或做在cpu內部;
【2.2】中斷判優邏輯
【問題2】多個中斷源同時提出中斷請求,怎么辦?
Cpu如何響應,響應對系統影響最大的中斷源;
對中斷源進行分級;響應優先級最高的中斷源(對中斷源的級別進行排隊);
排隊器可以在中斷源接口電路,或在cpu內部;
上圖由硬件實現的排隊器;也可以軟件實現排隊器;如下:
【3】 中斷服務程序入口地址的尋找
【3.1】硬件向量法
? 排隊器輸出:只有1根線是高電平1,其他全部為低電平0;
向量地址形成部件:根據排隊器輸出,確定需要響應的中斷源,從而確定執行哪一個中斷服務程序(通過中斷向量地址確定);
【問題3】如何尋找中斷服務程序的入口地址?(硬件向量法,或軟件查詢法)
用硬件查找中斷服務程序入口地址有兩種方法:
- 方法1: 在中斷向量地址的存儲單元中存放一條跳轉指令 如 jmp 200,則200就是中斷服務程序的入口地址;
- 方法2: 在中斷向量地址的存儲單元中存放的就是中斷服務程序的入口地址,如中斷向量地址12H,其保存的入口地址200;
【3.2】軟件查找法
用軟件如何查找中斷服務程序入口地址?
通過執行中斷識別程序,進行查找;
利用軟件方法更加靈活;
中斷識別程序查詢步驟:
| 步驟 | 指令 | 說明 |
| 1 | SKP DZ 1# | SKP表示跳過下一條指令; 指令功能:查詢第1號中斷源的完成觸發器D;看觸發器是等于0還是等于1; |
| 2 | JMP 1#SR | 執行中斷服務程序 |
| 3 | SKP DZ 2 | …… |
| 4 | JMP 2SR | …… |
?【4】中斷響應?
?【問題4】Cpu在什么條件,什么時間,以什么方式響應中斷?
1)cpu在什么條件下響應中斷請求 ?
- 為了表示cpu是否響應中斷請求,有一個允許中斷觸發器EINT,值=1表示允許cpu響應中斷源發出的中斷請求;
2)cpu在什么時間響應中斷請求 ?
通常情況下,cpu只有在指令的執行階段結束以后,才能夠響應中斷請求;
但cpu的某些指令的執行階段比較長,這種情況就允許cpu在指令執行過程中,響應中斷請求;
問題: 為什么cpu要把響應中斷的時間放在指令執行階段以后呢?
3)cpu響應中斷過程:
- 在指令執行以后,cpu發送查詢信號到中斷源的中斷請求觸發器;查詢信號把中斷請求觸發器的輸出端設置為1,把中斷請求信號發送到排隊電路;
【4.3】中斷隱指令
1)中斷隱指令:說的是保存程序斷點,尋找中斷服務程序入口地址,關中斷這3個步驟是計算機硬件來完成的,并不是在某一條具體指令的驅動下完成的;即,中斷隱指令并不是指令集中的指令;但在響應中斷過程中,這些硬件操作都要執行;??
EINT,允許中斷的R-S觸發器; (值為1,表示允許中斷)
INT,中斷標記的R-S觸發器;(值為1,表示相應中斷;只要INT設置為1,EINT就要被設置為0)?
?【4.3.1】中斷響應過程中要解決的3個問題:
問題1)保護程序斷點: 斷點就是中斷服務程序執行完成后,返回執行的指令;
- 方法1:斷點存到特定地址(0號地址)內;
- 方法2:斷點進棧;
問題2) 尋找中斷服務程序入口地址;
- 方法1)采用硬件向量法:把中斷向量地址發送到PC寄存器;PC中保存了向量地址,這個向量地址保存了中斷服務程序的入口地址,或跳轉指令,該指令會跳轉到中斷服務程序;
- 方法2)軟件查詢法:中斷識別程序的入口地址發送到PC寄存器;計算機執行中斷識別程序來查找中斷服務程序的入口地址;
問題3)硬件關中斷(把中斷允許觸發器的值設置為0);
- 關中斷的目的:避免在單重中斷的機器中,在執行中斷服務程序的過程中,有新的中斷源會打斷當前的中斷服務程序的執行;
另外,即使在多重中斷的cpu中,采用關中斷的方式,也是為了保存程序斷點,保存程序現場的一個過程;
【4.3.2】中斷響應步驟
| 步驟 | 描述 |
| 1 | Cpu完成指令執行階段后,通過硬件向量法查找中斷源;各個中斷源的信號送入排隊器; |
| 2 | 排隊器把中斷源信號(只有一根線為1)送給中斷標記觸發器,從而把INT設置為1,而EINT設置為0; |
| 3 | 此外,排隊器還要把中斷信號送給向量地址形成部件,這個向量地址送給PC,為執行中斷服務程序做準備;(向量地址保存了中斷服務程序的入口地址) |
【5】保護現場與恢復現場
1)保護現場
- 1.1 )保存斷點:由中斷隱指令(硬件)來做,包括3個步驟(保存斷點,形成中斷服務程序的入口地址,硬件關中斷) ;
- 1.2)保存寄存器內容(由中斷服務程序來做,軟件):cpu當中的一些寄存器在執行中斷服務程序的時候需要用到;這些寄存器的內容也要進行保存 ;因為這些內容將來中斷返回的時候,主程序還要用到;
2)恢復現場
- 2.1)由中斷服務程序完成;因為中斷服務程序在保存現場的時候,可以吧寄存器內容壓入到堆棧中;在中斷服務程序恢復現場時,可以出棧;
3)中斷服務程序的工作內容包括:
【6】 多重中斷
【6.1】多重中斷概念
【問題7】處理中斷的過程中又出現新的中斷,怎么辦?
再問:如果新的中斷源的優先級,高于當前正在處理的中斷源的優先級,又要如何處理?處理過程如下:
- 處理中斷1時,發生了中斷2,且中斷2優先級大于中斷1,則停止中斷1的服務程序,轉而執行中斷2的服務程序;
- 處理中斷2時,發生了中斷3,且中斷3優先級大于中斷2,則停止中斷2的服務程序,轉而執行中斷3的服務程序;
- 上圖中: 產生了3次中斷,和3個斷點,分別是 k+1, l+1, m+1 ;
【6.2】實現多重中斷的條件
1)要允許cpu在執行某個中斷服務程序時,響應新的中斷請求;就要提前打開 EINT允許中斷觸發器(設置 EINT=1);
2)是不是任何一個新的中斷請求都能打斷當前正在執行的中斷服務?不是的;
只有高優先級的中斷源才可以打斷低優先級中斷源;
3)中斷過程如下:
| 時間 軸 | 中斷 請求 | 主程序 | 中斷服務程序(優先級降序) | |||
| A | B | C | D | |||
| 1 | BC | |||||
| 2 | 保存主程序斷點 | |||||
| 3 | 轉到中斷服務程序B | 執行 | ||||
| 4 | 從B中恢復到主程序斷點 | |||||
| 5 | 保存主程序斷點 | |||||
| 6 | D | 轉到中斷服務程序C | 執行 | |||
| 7 | 從C中恢復到主程序斷點 | |||||
| 8 | 保存主程序斷點 | |||||
| 9 | A | 轉到中斷服務程序D | 執行 | |||
| 10 | 保存中斷服務程序D的斷點 | |||||
| 11 | 轉到中斷服務程序A | 執行 | ||||
| 12 | 從A恢復到中斷服務程序D斷點繼續執行 | |||||
| 13 | 從D種恢復繼續執行 | |||||
詳細步驟解析如下:
- 1)?? ?主程序在運行時,中斷源BC請求中斷;
- 2)?? ?又B優先級高于C,則主程序響應B中斷,保存主程序中斷斷點,執行B的中斷服務程序;
- 3)?? ?恢復現場到主程序;
- 4)?? ?主程序響應中斷C,保存主程序的中斷斷點,執行C的中斷服務程序;
- 5)?? ?在執行C的中斷服務程序過程中,中斷D請求中斷;由C的優先級高于D,所以cpu不會理會D,而是繼續執行中斷C;
- 6)?? ?恢復現場到主程序;
- 7)?? ?主程序響應中斷D,保存主程序的斷點,執行D的中斷服務程序;
- 8)?? ?在執行D的過程中,中斷源A請求中斷;
- 9)?? ?又A的優先級高于D;所以保存D的中斷服務程序為斷點,轉而響應中斷A,執行A的中斷服務程序;
- 10)?? ?恢復現場到D的中斷服務程序;執行D的中斷服務程序;
- 11)?? ?恢復到主程序;
【補充】 中斷誰就要返回到誰的執行現場;
【6.3】中斷屏蔽技術
refer2? 中斷屏蔽技術_PacosonSWJTU的博客-CSDN博客
【6.4】多重中斷的斷點保護
1)斷點保護有2個方法:
- 方法1:斷點進棧;由中斷隱指令來完成;
- 方法2:斷點存入0號或某個內存地址,由中斷隱指令來完成;
2)在中斷周期中,需要保存斷點;如斷點保存到0地址;
- 步驟1:把0地址送入MAR,主存地址寄存器;
- 步驟2:命令存儲器寫操作;
- 步驟3:把PC保存的斷點值寫入MDR,主存數據寄存器;之前把斷點(下一條指令地址)寫入0地址,斷點在PC寄存器中,因為PC寄存器存儲了下一條要執行的指令的地址(下一條指的是主程序或當前正在執行的程序的下一條);
- 步驟4:把MDR的數據送入到MAR指向的內存單元中;
3)有個問題:中斷周期的保存斷點階段,如果都把斷點地址保存到0地址,那遇到多種中斷,下一個中斷周期的斷點地址就會把上一個中斷的斷點給覆蓋掉;
如何保證斷點內容不丟失呢?
【6.4.3】程序斷點存入0地址的斷點保護
上述指令列表的執行步驟如下:
| 向量地址 | 內容 | 說明 |
| 0 | 斷點內容 | 保存程序斷點到0地址; |
| 5 | JMP SERVE | serve 是中斷服務程序的入口地址; 中斷向量形成部件把向量地址5送入pc寄存器; |
| SERVE | STA SERVE | 保存現場; 如保存acc寄存器的內容到SERVE指向的內存單元中; |
| … | ||
| LDA 0 | 把0地址的內存單元數據取出來放入acc寄存器; 0地址的內存就是程序斷點; | |
| STA RETURN | 通過STA指令,把程序斷點保存在RETURN單元; (通過轉存把程序斷點保護起來) | |
| 置屏蔽字 | 設置中斷屏蔽字在開中斷之前; | |
| ENI | 開中斷 | |
| … | ||
| LDA SAVE | 恢復程序現場;把SAVE內存單元的內容送入acc寄存器; | |
| 恢復中斷屏蔽字 | 在返回中斷之前,要恢復中斷屏蔽字; | |
| JMP @ RETURN | 通過一條間接跳轉指令(間址尋址); 跳轉到RETURN內存單元保存的那個地址(程序斷點); | |
| SAVE | XXX | 存放ACC內容 |
| RETURN | XXX | 轉存0地址內容 |
總結
- 上一篇: 10.1-控制单元CU的组合逻辑设计
- 下一篇: 手机内存清理技巧有哪些