如果用一句話概括操作系統的原理,那就是:整個操作系統就是一個中斷驅動的死循環,用最簡單的代碼解釋如下:
while(true){doNothing();
}
其他所有事情都是由操作系統提前注冊的中斷機制和其對應的中斷處理函數完成的。我們點擊一下鼠標,敲擊一下鍵盤,執行一個程序,都是用中斷的方式來通知操作系統幫我們處理這些事件,當沒有任何需要操作系統處理的事件時,它就乖乖地待在死循環里不出來。
所以,中斷非常重要,它是讓我們理解整個操作系統的根基。
五花八門的中斷分類
在Intel CPU手冊中對中斷的定義有一個官方的標準答案。如下圖:
這段話概括起來的意思就是:中斷可以分為中斷和異常,異常又可以分為故障、陷阱和中止。
第一句話有點奇怪,啥叫中斷又可以分為中斷和異常呢?其他很多文章也是這么寫的,不知道你有沒有感到疑惑。
原文的意思準確的說就是,CPU提供了兩種中斷程序執行的機制,中斷和異常。第一個中斷是動詞,第二個中斷時真正的機制種類。
先說第一個機制---中斷(interrupt),中斷時一個異步事件,通常由I/O設備觸發。比如點擊一下鼠標,敲擊一下鍵盤。
再說第二個機制--異常,異常是一個同步事件,是CPU在執行指令時檢測到的反常條件。比如除法異常、錯誤指令異常、缺頁異常等。
這兩個機制,殊途同歸,都是讓CPU收到一個中斷號,至于CPU收到這個中斷號后干什么,我們暫且不管。
我們先看看收到中斷號之前,中斷和異常是怎么給CPU一個中斷號的。先說中斷。
有一個設備叫做可編程中斷控制器,它有很多IRQ引腳線,接入了一堆能發出中斷請求的硬件設備。當這些硬件設備給IRQ引腳發送一個信號時,由于可編程中斷控制器提前被設置好了IRQ與中斷號的對應關系,所以就轉化成了對應的中斷信號。把這個中斷號存儲在自己的一個端口上,然后給CPU的INTR引腳發送一個信號,CPU收到INTR引腳信號后,去剛剛的那個端口可讀取到這個終端號的值。
你看,最終的目標,就是讓CPU知道,有中斷了,并且也知道中斷號時多少。
比如按下圖3中的鍵盤,最終到CPU那里的反應就是,得到了一個中斷號0x21。
那異常的即使就更簡單了,時CPU自己執行指令時檢測到一些反常情況,然后自己給自己一個中斷號,無須外界提供。
比如,CPU執行到了一個無效指令,則自己給自己一個中斷號0x06,這個中斷號是CPU提前就規定好寫死了的硬布線邏輯。
好了,到目前位置,我們知道了無論是中斷還是異常