① 在計算機系統中,請解釋什麼是中斷,請用流程圖畫出一次中斷處理流程
中斷是指計算機運行過程中,出現某些意外情況需主機干預時,機器能自動停止正在運行的程序並轉入處理新情況的程序,處理完畢後又返回原被暫停的程序繼續運行。
中斷流程圖如下:
(1)中斷程序的調用過程擴展閱讀
眾所周知,處理器的速度跟外圍硬體設備的速度往往不在一個數量級上,因此,如果內核採取讓處理器向硬體發出一個請求,然後專門等待回應的辦法,顯然降低內核效率。
既然硬體的響應這么慢,那麼內核就應該在此期間處理其他事務,等到硬體真正完成了請求的操作之後,再回過頭來對它進行處理。想要實現這種功能,輪詢(polling)可能會是一種解決辦法。可以讓內核定期對設備的狀態進行查詢,然後做出相應的處理。
不過這種方法很可能會讓那個內核做不少無用功,因為無論硬體設備是正在忙碌著完成任務還是已經大功告成,輪詢總會周期性的重復執行。更好的辦法是由我們來提供一種機制,讓硬體在需要的時候再向內核發出信號(變內核主動為硬體主動),這就是中斷機制。
中斷使得硬體得以與處理器進行通信。舉個例子,在你敲打鍵盤的時候,鍵盤控制器(控制鍵盤的硬體設備)會發送一個中斷,通知操作系統有鍵按下。中斷本質是一種特殊的電信號,由硬體設備發向處理器。
處理器接受到中斷後,會馬上向操作系統反映此信號的到來,然後就由os負責處理這些新到來的數據。硬體設備生成中斷的時候並不考慮與處理器的時鍾同步——換句話說就是中斷隨時可以產生。因此,內核隨時可能因為新到來的中斷而被打斷。
不同的設備對應的中斷不同,而每個中斷都通過一個惟一的數字標識。因此,來自鍵盤的中斷就有別於來自硬碟的中斷,從而使得操作系統能夠對中斷進行區分,並知道哪個硬體設備產生了哪個中斷。這樣,操作系統才能給不同的中斷提供不同的中斷處理程序。
在它執行程序的時候,如果有另外的事件發生(比如用戶又打開了一個程序)那麼這時候就需要由計算機系統的中斷機制來處理了。
中斷機制包括硬體的中斷裝置和操作系統的中斷處理服務程序。
讓硬體在需要的時候再向內核發出信號。
參考資料來源:網路-中斷機制
參考資料來源:網路-中斷
② Linux內核中斷之中斷調用流程
本文基於 RockPI 4A 單板Linux4.4內核介紹中斷調用流程。
ARMv8包括兩種運行狀態:AArch64和AArch32。
AArch64中不再使用AArch32中的7種特權模式,而是提出了Exception Levels的概念,包括:
1)EL0:用於用戶態程序,許可權最低
2)EL1:給內核使用,許可權稍高
3)EL2:虛擬化相關,許可權更高
4)EL3:安全相關,許可權最高
Linux內核中一般只使用EL0和EL1。
AArch64異常向量表中的異常包括:
1)Synchronous exception(同步異常)
2)SError
3)IRQ
4)FIQ
註:SError、IRQ和FIQ屬於非同步異常。
在Linux內核中,在 arch/arm64/kernel/entry.S 文件中定義了異常向量表,內容如下:
選取 el1_irq() 函數介紹Linux內核中斷的調用流程。
文件: arch/arm64/kernel/entry.S ,調用流程如下:
1、handle_irq()初始化
在 DTS 解析階段完成 handle_irq() 函數的初始化,流程如下:
gic_irq_domain_map() 函數中完成了 handle_irq() 函數的賦值,具體執行如下:
2、handle_irq()實現
以共享外設中斷 SPI 的中斷處理函數 handle_fasteoi_irq() 為例,繼續跟蹤中斷的執行過程。
handle_irq_event_percpu() 函數會調用已經注冊的中斷處理函數,同時喚醒 irq_thread 線程。
3、中斷處理線程
在使用 request_threaded_irq() 函數申請中斷時,會創建一個 irq_thread 線程,調用流程如下:
irq_thread 線程平時在睡眠狀態,等待 handle_irq_event_percpu() 函數喚醒,進一步執行已注冊的中斷處理線程函數。
使用 DRM 框架中 HDMI 中斷驗證中斷調用流程。
文件: driversgpudrmridgesynopsysdw-hdmi.c
在中斷處理函數 dw_hdmi_hardirq() 和中斷處理線程函數 dw_hdmi_irq 中增加 mp_stack() 調用( 註:僅限於調試驗證 )。
插入 HDMI 線,系統啟動後,顯示中斷調用流程的日誌如下:
和
③ 中斷處理的一般過程是什麼
中斷請求(中斷響應條件和時間},中斷響應過程,中斷返回