linux中斷

文章主要是本人的認識,介紹也不全面,則重於流程,用詞方面也不講究,很多觀點也比較粗糙,有錯誤的地方,請多多指正。

文章主要參考《深入分析linux內核源碼》關於中斷的章節:http://oss.org.cn/kernel-book/


中斷是計算機系統的一種機制,主要有兩種作用:

  1. 實現異步。

  2. 緊急處理某一過程。


    由於CPU與外設的運行速率相差較大,且CPU資源比較重要,如果採用同步的方式讓CPU與外設進行通信,則當外設在工作時,CPU就要等待外設完成工作並返回結果時,CPU才能斷續運行,這段時間就會讓CPU資源白白浪費。爲了能夠釋放CPU資源,外設與CPU之間就要採用異步的通信方式。CPU可以每隔一段時間去訪問設備來檢測設備是否已完成工作,但這樣的方式也會有一些問題,如CPU響應外設不及時,輪詢浪費CPU資源,輪詢未得到結果後要再次輪詢等。爲了更好地利用CPU資源,需要採取一種設備完成工作後能通知CPU,CPU能儘快響應通知的機制。而這種機制就是中斷了。


    中斷可以分爲硬中斷和軟中斷。

    硬中斷是指由硬件產生的中斷,如硬盤數據與準備就緒請求讀入內存,或進程時間片用完產生中斷等。

    軟件中斷是指由程序(軟件)產生的中斷,或是由中斷指令產生的中斷,如出現除0等。


    中斷又可以分爲可屏蔽中斷和不可屏蔽中斷,顧名思義,可屏蔽中斷是可以被屏蔽,而不可屏蔽中斷是不可屏蔽的,如電源掉電。


    程序的指令中會設有中斷檢查點,當執行至中斷檢查點時,CPU就會去檢查是否有中斷到來,如果有中斷到來,並且程序沒有屏蔽此中斷或是此中斷不可屏蔽時,系統進會進行中斷處理。


    中斷處理過程粗略可分爲三個過程:保護現場,執行中斷例程,恢復現場

    而更詳細的過程則如下

----------------------------------

關中斷

保存斷點,保護現場

判斷中斷源,轉中斷服務程序

開中斷

執行中斷處理程序

關中斷

恢復現場,恢復斷點

開中斷

----------------------------------

其中有兩個關中斷開中斷的過程,是因爲這兩個過程內的操作是不允許被中斷的,如果被中斷,就有可能導致中斷恢復失敗。


中斷號:0-255(中斷和異常)

    中斷號上是用來標識不同的中斷,不同的中斷號對應不同的中斷處理程序。那麼如何通過中斷號去查找中斷程序的入口,那就要需要一個表,而這個表計算機組成原理中稱之爲中斷向量,是保存中斷服務程序入口的數組。而在linux中,關於這些名稱可能會有所不同。linux中把中斷號叫做中斷向量,把中斷服務程序入口地址表稱之爲中斷描述符表(IDT)。下面採用的是linux的叫法。

    在linux系統啓動的時候,最初是運行在實模式下,這時系統就會進行第一遍初始化IDT,但IDT中每個中斷程序的入口都是一個空的中斷程序。而當系統完成啓用分頁後,就會再一次初始化IDT,此時就會在IDT中填入真正的中斷程序入口。IDT中不僅包含了中斷程序的入口,而且還包含了一些中斷的相關描述,如這個中斷是中斷門、陷阱門或是系統門。其中 0-19 號和 0x80 號這21箇中斷號是系統使用的,IDT中這些中斷都被系統初始化,而其他的中斷號則是另外的初始化,在初始化這些IDT項時,就需要填入中斷程序的地址。而這些中斷程序的地址,來自於一箇中斷程序入口的數組。










發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章