Linux(核心剖析):19---中斷總體概述
江南、董少發表於2020-01-13
一、為什麼要引入中斷?
- 任何作業系統核心的核心任務,都包含有對連線到計算機上的硬體裝置進行有效管理,如硬碟、藍光碟機、鍵盤、滑鼠、3D 處理器,以及無線電等。而想要管理這些裝置,首先要能和它們互通音信才行。眾所周知,處理器的速度跟外圍硬體裝置的速度往往不在一個數量級上,因此,如果核心採取讓處理器向硬體發出一個請求,然後專門等待迴應的辦法,顯然差強人意。既然硬體的響應這麼慢,那麼核心就應該在此期間處理其他事務,等到硬體真正完成了請求的操作之後,再回過頭來對它進行處理
- 那麼到底如何讓處理器和這些外部裝置能協同工作,且不會降低機器的整體效能呢?輪詢 (polling) 可能會是一種解決辦法。它可以讓核心定期對裝置的狀態進行查詢,然後做出相應的處理。不過這種方法很可能會讓核心做不少無用功,因為無論硬體裝置是正在忙碌著完成任務還是已經大功告成,輪詢總會週期性地重複執行
- 更好的辦法是由我們來提供一種機制,讓硬體在需要的時候再向核心發出訊號(變核心主動為硬體主動)。這就是中斷機制
二、中斷
- 中斷使得硬體得以發出通知給處理器。例如,在你敲擊鍵盤的時候,鍵盤控制器(控制鍵盤的硬體裝置)會傳送一箇中斷,通知作業系統有鍵按下
- 中斷本質上是一種特殊的電訊號,由硬 件裝置發向處理器。處理器接收到中斷後,會馬上向作業系統反映此訊號的到來,然後就由作業系統負責處理這些新到來的資料。硬體裝置生成中斷的時候並不考慮與處理器的時鐘同步——換句話說就是中斷隨時可以產生。因此,核心隨時可能因為新到來的中斷而被打斷
中斷的物理本質——電訊號
- 從物理學的角度看,中斷是一種電訊號,由硬體裝置生成,並直接送入中斷控制器的輸入引腳中——中斷控制器是個簡單的電子晶片,其作用是將多路中斷管線,採用複用技術只通過一個和處理器相連線的管線與處理器通訊
- 當接收到一箇中斷後,中斷控制器會給處理器傳送一個電訊號。處理器一經檢測到此訊號,便中斷自己的當前工作轉而處理中斷。此後,處理器會通知作業系統已經產生中斷,這樣,作業系統就可以對這個中斷進行適當地處理了
三、中斷號(IRQ)
- 不同的裝置對應的中斷不同,而每個中斷都通過一個唯一的數字標誌。因此,來自鍵盤的中斷就有別於來自硬碟的中斷,從而使得作業系統能夠對中斷進行區分,並知道哪個硬體裝置產生了哪個中斷。這樣,作業系統才能給不同的中斷提供對應的中斷處理程式
- 這些中斷值通常被稱為中斷請求(IRQ)線。每個IRQ線都會被關聯一個數值量一一例如,在經典的PC機上,IRQ 0是時鐘中斷,而 IRQ 1是鍵盤中斷
- 但並非所有的中斷號都是這樣嚴格定義的。例如,對於連線在PCI匯流排上的裝置而言,中斷是動態分配的。而且其他非PC的體系結構也具有動態分配可用中斷的特性
- 重點在於特定的中斷總是與特定的裝置相關聯,並且核心要知道這些資訊
- 實際上,硬體發出中斷是為了引起核心的關注,例如:嗨 ,我有新的按鍵等待處理呢,讀取並處理這些調皮鬼吧!
四、中斷與異常的關係與區別
- 在作業系統中,討論中斷就不能不提及異常
- 異常與中斷不同,它在產生時必須考慮與處理器時鐘同步。實際上,異常也常常稱為同步中斷。在處理器執行到由於程式設計失誤而導致的錯誤指令(如被除0除)的時候,或者是在執行期間出現特殊情況(如缺頁),必須靠核心來處理的時候,處理器就會產生一個異常。因為許多處理器體系結構處理異常與處理中斷的方式類似,因此,核心對它們的處理也很類似
- 本人的這些文章對中斷(由硬體產生的非同步中斷)的討論,大部分也適合於異常(由處理器本身產生的同步中斷)
- 你已經熟悉一種異常:在前面講述系統呼叫的時候(https://blog.csdn.net/qq_41453285/article/details/103802375)已經提過,在x86體系結構上如何通過軟中斷實現系統呼叫,那就是陷入核心,然後引起一種特殊的異常——系統呼叫處理程式異常。你會看到,中斷的工作方式與之類似,其差異只在於中斷是由硬體而不是軟體引起的
五、中斷處理程式
六、中斷上下文、中斷處理機制的實現
七、中斷控制