x86异常处理与中断机制(1)概述中断的来源和处理方式
參考《計算機組成》(北京大學 MOOC)
1 異常與中斷的來源(為什么需要中斷)
首先,說明一下異常和中斷這兩個概念。
它們兩個唯一的區別,就是,沒有什么區別。只是不同的地方不同的時間不同的人的叫法不一樣,所以,不用太在意區別了,以后我們統稱中斷。
1.1 什么時候發生中斷
一句話!CPU正在干活的時候,有事情打擾它,不讓他繼續正常工作了,需要去處理其他事情。
那么是什么事情呢?這個事情分成兩類
- 內部的事情
- 外部的事情
1.1.1 內部的事情
簡而言之,就是執行指令的時候,出現狀況了。
出現什么狀況了?舉例說明
關于這一點,在80386手冊中是提及過的。
這些中斷如何被判斷出來的?
硬件判斷的!
我們知到,在CPU中有ALU,ALU的輸出結果是有結果相關信號的,對于x86體系,會有各種各樣的標志位,標志位的結果,是硬件直接給出的,例如下圖的ALU的輸出結果(ZF SF CF OF)
這些輸出的信號,會作用到CPU的其他部件,從而能夠讓CPU暫停當前工作轉而處理異常事件,至于具體發生了什么,我們后面會提及。
關于內部事件的命名
別看只是一個內部事件,關于它的命名有很多,我們來解釋一下,就能夠清晰明了了。
1.1.2 外部的事情
這個中斷是CPU外部向CPU發出的中斷信號,導致CPU不得不停下手頭的工作。例如8259A芯片。
這里有一篇8259A芯片 詳解。
外部中斷是外部硬件發出的,所以也叫硬件中斷,它是被外部信號直接打斷,也被稱為中斷。
最后,附上這個圖,作為上面內容的小結。
1.1.3 內部中斷和外部中斷的區別
用一個比喻來解決:
- 內部中斷,就好比你在工作位工作,然后不小心把水碰撒了,你不得不停下工作,先把灑出來的水擦干凈,再繼續工作。
- 外部中斷:你在工作,然后你的老板通知你馬上開會,你只能先去開會,開完會再繼續工作。
1.1.4 未解決的細節問題
我們知到MIPS架構下,中斷是在執行完每條指令后判斷是不是發生中斷,那么,對于內部中斷和外部中斷(x86下),具體細節又是什么呢?中斷什么時候判斷什么時候執行?
下圖是MIPS的:
x86也一樣的,因為指令執行的切換,需要EIP的改變,EIP的改變就需要到達指定時鐘周期,因此來說,執行下一條指令or中斷服務程序第一條指令的區別就是,EIP更新部件選擇更新的值不同而已,本質上都是更新EIP的值。
1.2 發生中斷之后干什么
好,現在CPU被某個事件打斷了,然后,CPU不得不處理這個事情,那么它接下來會干什么呢?
假設現在進行了add指令,加法得到的結果溢出了,運算結果存儲不下,怎么辦?
我們看一看第一個能夠處理溢出異常的計算機,如果檢測到發生溢出,就自動轉向地址0,執行提前存好的程序,執行完之后,再回去繼續執行原來的程序,這個地址0的程序是用來處理溢出的,這也就是中斷服務程序。
這樣就實現了計算機自動去處理溢出異常的情況,使得計算機不會因為異常而停機,同時,這個異常處理的程序,是軟件,后續還可以進行修改。
因此這里就有重要的點
對于問題1,設計一下ALU的硬件電路很容易解決,前面也提到過,不再細說,在《計算機系統基礎》(袁春風)教材里提及過這個細節。
對于問題2,我們在檢測到運算結果溢出之后,把它發送給EIP指令地址更新部件,一旦溢出,在下一個周期,就會EIP = 0,就能夠執行0號單元的程序了。(這么一說,這里是在當前指令執行的時候檢測出異常,在下一條指令執行之前切換到了中斷服務程序,因此和MIPS一樣夾在中間)
對于問題3,我們需要在執行中斷處理程序之前,保存好本來應該正常執行的指令的地址,以便于切換回去,這也就涉及到了保護現場和恢復現場的工作。
剛才談及的是遇到內部中斷,現在看看外部中斷。
對于80386來說,外部中斷通過8259A芯片給它發送的中斷信號,接收到中斷信號之后,在進行相關的處理,而8259A另一邊則連接各種外設(鼠標,鍵盤…)來,這樣CPU就能夠處理外部中斷請求了,具體操作還是
- 保存現場
- 執行中斷處理程序
- 恢復現場
這里是現場,是概括性的,具體包含的內容后續闡述。
1.2.1 小結
對于整個中斷的發生以及處理過程,怎么解釋呢?我們看一下:
用一個比喻來解決:
- 內部中斷,你在工作位工作(指令正常執行),然后不小心把水碰撒到了電腦上(遇到了內部中斷),你不得先保存正在編輯的文件然后關機(保存現場),把灑出來的水擦干凈(執行中斷處理程序),再打開電腦,打開剛才保存的文件(恢復現場),之后繼續工作(繼續執行指令)。
- 外部中斷:你在工作,然后你的老板通知你馬上開會(外部中斷),你只能先保存好手頭工作,之后去開會,回來的時候打開之前保存的文件,繼續工作。
2 整篇小結
這里僅僅以僅有一個溢出異常處理為例子,來梳理一下整個流程。
按照北大MOOC中給的例子就是,在當前頁面執行完加法,發現放不下,因此翻到第一頁去執行程序,執行完之后,再翻回來繼續執行。
總結
以上是生活随笔為你收集整理的x86异常处理与中断机制(1)概述中断的来源和处理方式的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 不孕不育的早期症状是怎样的
- 下一篇: 【C language】typedef的