異常與中斷向量

異常與中斷向量


中斷中有些問題需要面對。

1、異常是什麼概念?

在處理器執行到由於編程失誤而導致的錯誤指令(例如除數是0)的時候,或者在執行期間出現特殊情況(例如缺頁),需要靠操作系統來處理的時候,處理器就會產生一個異常。對大部分處理器體系結構來說,處理異常和處理中斷的方式基本是相同的,x86架構的CPU也是如此。異常與中斷還是有些區別,異常的產生必須考慮與處理器時鐘的同步。實際上,異常往往被稱為同步中斷。

2、中斷向量是什麼?

中斷向量代表的是中斷源——從某種程度上講,可以看作是中斷或異常的類型。中斷和異常的種類很多,比如說被0除是一種異常,缺頁又是一種異常,網卡會產生中斷,聲卡也會產生中斷,CPU如何區分它們呢?中斷向量的概念就是由此引出的,其實它就是一個被送通往CPU數據線的一個整數。CPU給每個IRQ分配了一個類型號,通過這個整數CPU來識別不同類型的中斷。這裡可能很多朋友會詢問為什麼還要弄箇中斷向量這麼麻煩的東東?為什麼不直接用IRQ0~IRQ15就完了?比如就讓IRQ0為0,IRQ1為1……,這不是要簡單得多麼?

異常與中斷向量

其實這裡體現了模塊化設計規則,及節約規則。

首先我們先談談節約規則,所謂節約規則就是所使用的信號線數越少越好,這樣如果每個IRQ都獨立使用一根數據線,如IRQ0用0號線,IRQ1用1號線……這樣,16個IRQ就會用16根線,這顯然是一種浪費。那麼也許馬上就有朋友會說:那麼只用4根線不就行了嗎?(2^4=16)。

這個問題,體現了模塊設計規則。我們在前面就說過中斷有很多類,可能是外部硬件觸發,也可能是由軟件觸發,然而對於CPU來說中斷就是中斷,只有一種,CPU不用管它到底是由外部硬件觸發的還是由運行的軟件本身觸發的,因為對於CPU來說,中斷處理的過程都是一樣的:中斷現行程序,轉到中斷服務程序處執行,回到被中斷的程序繼續執行。CPU總共可以處理256種中斷,而並不知道,也不應當讓CPU知道這是硬件來的中斷還是軟件來的中斷,這樣,就可以使CPU的設計獨立於中斷控制器的設計,這樣CPU所需完成的工作就很單純了。

CPU對於其他的模塊只提供了一種接口,這就是256箇中斷處理向量,也稱為中斷號。由這些中斷控制器自行去使用這256箇中斷號中的一個與CPU進行交互,比如,硬件中斷可以使用前128個號,軟件中斷使用後128個號,也可以軟件中斷使用前128個號,硬件中斷使用後128個號,這與CPU完全無關了,當你需要處理的時候,只需告訴CPU你用的是哪個中斷號就行,而不需告訴CPU你是來自哪兒的中斷。這樣也方便了以後的擴充,比如現在機器裡又加了一片8259芯片,那麼這個芯片就可以使用空閒的中斷號,看哪一個空閒就使用哪一個,而不是必須要使用第0號,或第1號中斷號了。其實這相當於一種映射機制,把IRQ信號映射到不同的中斷號上,IRQ的排列或說編號是固定的,但通過改變映射機制,就可以讓IRQ映射到不同的中斷號,也可以說調用不同的中斷服務程序。

3、什麼是中斷服務程序?

在響應一個特定中斷的時候,內核會執行一個函數,該函數叫做中斷處理程序(interrupt handler)或中斷服務程序(interrupt service routine(ISR))。產生中斷的每個設備都有相應的中斷處理程序。例如,由一個函數專門處理來自系統時鐘的中斷,而另外一個函數專門處理由鍵盤產生的中斷。

一般來說,中斷服務程序要負責與硬件進行交互,告訴該設備中斷已被接收。此外,還需要完成其他相關工作。比如說網絡設備的中斷服務程序除了要對硬件應答,還要把來自硬件的網絡數據包拷貝到內存,對其進行處理後再交給合適的協議棧或應用程序。每個中斷服務程序根據其要完成的任務,複雜程度各不相同。

一般來說,一個設備的中斷服務程序是它的設備驅動程序(device driver)的一部分——設備驅動程序是用於對設備進行管理的內核代碼。

異常與中斷向量

原文地址:卿萃科技FPGA極客空間 微信公眾號


分享到:


相關文章: