中斷和異常

    處理器的速度和外圍硬件設備的速度往往不在一個數量級上, 因此, 如果Linux內核採取讓處理器向硬件發出一個請求, 然後專門等待迴應, 這種辦法顯然不好.

    硬件響應慢, 因此內核需要在這段時間內處理其他事務, 等到硬件真正完成了請求的操作之後, 內核再回來對它進行處理. 要實現這種功能, 有兩種方法: 輪詢和中斷.

    輪詢(polling)可以讓內核定期對設備的狀態進行查詢, 然後做出相應的處理. 不過這種方法會讓內核做很多無用功, 因爲輪詢總會週期性的重複執行, 而無論 硬件設備的當前是否忙碌. 更好的辦法是一種讓硬件在需要的時間再向內核發出信號(變內核主動爲硬件主動), 這就是中斷機制.

1. 中斷的概念:

中斷本質上是一種特殊的電信號, 由硬件設備生成, 並直接送入中斷控制器的輸入引腳上, 然後再由中斷控制器向處理器發送響應的信號. 處理器接到中斷後, 便中斷自己當前的工作轉而處理中斷, 並會馬上向操作系統反映此信號的到來, 然後由操作系統負責處理這些新到來的數據. 中斷是硬件與處理器通信的手段. 當你敲擊鍵盤的時候, 鍵盤控制器會發送一箇中斷, 通知操作系統有鍵被按下.

中斷隨時可以產生, 不與處理器的時鐘同步.

 

2. 中斷請求(IRQ):

不同設備對應的中斷不同, 每個中斷都有唯一的數字標識. 這使得操作系統能夠對中斷進行區分, 並知道哪個硬件設備產生了哪個中斷.

這些中斷值就是中斷請求(IRQ)線. 通常IRQ都是一些數值量. 例如, 在PC上, IRQ0是時鐘中斷, 而IRQ1是鍵盤中斷. 也有的中斷號是動態分配的, 比如PCI總線上的設備.

 

3. 中斷的分類:

中斷有三種機制.

  • 由CPU外部產生, 比如鍵盤中斷, 由鍵盤控制器產生信號發送給中斷控制器, 再由中斷控制器通知CPU, CPU通知操作系統進行中斷處理. 這種中斷是異步的.
  • 由CPU本身在執行的過程中產生. 比如DOS系統調用INT 21H, 這種中斷是同步的. 又稱爲"陷入".
  • 由CPU執行到由於編程失誤而導致的錯誤指令時, 或者在執行期間出現特殊情況, 必須靠內核來處理的時候, 處理器就會產生一個異常. 比如除0, 缺頁, new的時候內存不足等. 這種中斷是異步的, 又成爲"異常".

但是不管是外部中斷, 陷入或是異常, CPU的響應過程基本一致. 這就是: 在執行當前指令後, 或是執行指令的過程中, 就根據中斷源所提供的"中斷向量", 在內存中找到響應服務程序入口並調用服務程序. 因此把它們統稱爲"中斷"

外部中斷是服務程序是由軟件或硬件設置好的;

"陷入"的向量是在"陷入"指令中發生的(INT N中的N);

各種異常的向量則是由CPU的硬件結構預先規定好的.

 

4. 系統調用:

系統調用由"陷入"方式實現, 即INT N, 因此也按照中斷的方式來處理.

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