概念
軟中斷是利用硬體中斷的概念,用軟體方式進行模擬,實現巨觀上的異步執行效果。很多情況下,軟中斷和"信號"有些類似,同時,軟中斷又是和硬中斷相對應的,"硬中斷是外部設備對CPU的中斷","軟中斷通常是硬中斷服務程式對核心的中斷","信號則是由核心(或其他進程)對某個進程的中斷"。
軟中斷是linux系統原“底半處理”的升級,在原有的基礎上發展的新的處理方式,以適應多cpu 、多執行緒的軟中斷處理。
軟中斷是實現系統API函式調用的手段
函式調用時將返回地址和CPU狀態暫存器內容壓棧,函式執行完畢後出棧返回斷點繼續執行。
軟中斷調用時將返回地址和CPU狀態暫存器內容壓棧,修改特權級,根據中斷號查找中斷向量表,找到ISR中斷服務例程地址,跳轉執行。
綜上,函式調用和軟中斷調用的區別是,軟中斷多了修改特權級和查找中斷向量表的功能,其他部分完全一樣。
一般,系統程式由軟體公司實現且不開源,你無法知道系統API函式的偏移地址,而且你寫的應用程式和軟體公司提供的系統程式是完全分開的,編譯器無法將二者連結在一起,同時,系統程式需要核心態特權才能運行,此時用函式調用的辦法是無法調用系統API函式的。解決這個問題的方法是使用軟中斷,當應用程式需要調用API時,就先設定功能號(如AX=0H),然後觸發軟中斷(如INT 80H)。系統程式設定好中斷向量表。這樣,應用程式就可以間接找到系統API了。
有了軟中斷,就可以實現應用程式的動態載入。就像WINDOWS/Linux那樣,應用程式和系統程式分別開發,不在一起編譯連線,應用程式通過軟中斷調用系統提供的功能。
原因
一般來說,軟中斷是由核心機制的觸發事件引起的(例如進程運行逾時),但是不可忽視有大量的軟中斷也是由於和硬體有關的中斷引起的,例如當印表機連線埠產生一個硬體中斷時,會通知和硬體相關的硬中斷,硬中斷就會產生一個軟中斷並送到作業系統核心里,這樣核心就會根據這個軟中斷喚醒睡眠在印表機任務佇列中的處理進程。
代碼的執行
Linux中的軟中斷機制用於系統中對時間要求最嚴格以及最重要的中斷下半部進行使用。在系統設計過程中,大家都清楚中斷上下文不能處理太多的事情,需要快速的返回,否則很容易導致中斷事件的丟失,所以這就產生了一個問題:中斷髮生之後的事務處理由誰來完成?在前後台程式中,由於只有中斷上下文和一個任務上下文,所以中斷上下文觸發事件,設定標記位,任務上下文循環掃描標記位,執行相應的動作,也就是中斷髮生之後的事情由任務來完成了,只不過任務上下文採用掃描的方式,實時性不能得到保證。在Linux系統和Windows系統中,這個不斷循環的任務就是本文所要講述的軟中斷daemon。在Windows中處理耗時的中斷事務稱之為中斷延遲處理,在Linux中稱之為中斷下半部,顯然中斷上半部處理清中斷之類十分清閒的動作,然後在退出中斷服務程式時觸發中斷下半部,完成具體的功能。
在Linux中,中斷下半部的實現基於軟中斷機制。所以理清楚軟中斷機制的原理,那么中斷下半部的實現也就非常簡單了。通過上述的描述,大家也應該清楚為什麼要定義軟中斷機制了,一句話就是為了要處理對時間要求不那么苛刻的任務,恰好中斷下半部就有這樣的需求,所以其實現採用了軟中斷機制。
機制實現原理
軟中斷機制的實現原理如圖所示:
核心元素
構成軟中斷機制的核心元素包括:
1、 軟中斷狀態暫存器soft interrupt state(irq_stat)
2、 軟中斷向量表(softirq_vec)
3、 軟中斷守護daemon
軟中斷的工作工程模擬了實際的中斷處理過程,當某一軟中斷事件發生後,首先需要設定對應的中斷標記位,觸發中斷事務,然後喚醒守護執行緒去檢測中斷狀態暫存器,如果通過查詢發現有軟中斷事務發生,那么通過查詢軟中斷向量表調用相應的軟中斷服務程式action()。這就是軟中斷的過程,與硬體中斷唯一不同的地方是從中斷標記到中斷服務程式的映射過程。在CPU的硬體中斷髮生之後,CPU需要將硬體中斷請求通過向量表映射成具體的服務程式,這個過程是硬體自動完成的,但是軟中斷不是,其需要守護執行緒去實現這一過程,這也就是軟體模擬的中斷,故稱之為軟中斷。
一個軟中斷不會去搶占另一個軟中斷,只有硬體中斷才可以搶占軟中斷,所以硬中斷能夠保證對時間的嚴格要求。
套用
DOS調用和BIOS調用,是用戶使用系統資源的重要方法和基本途徑,也是用戶編寫MS—DOS應用程式使用很頻繁的重要內容,應學會使用。
除了上述硬中斷和軟中斷兩類中斷外,微型計算機的中斷系統還包括一些特殊中斷。這些中斷既不是由外圍設備提出申請而產生的,也不是由用戶在程式中發中斷指令INT nH而發生的,而是由內部的突發事件所引起的中斷,即在執行指令的過程中,CPU發現某種突發事件時啟動內部邏輯轉去執行預先規定的中斷號所對應的中斷服務程式。這類中斷也是不可禁止中斷,其中斷處理過程具有與軟中斷相同的特點,因此,有的教材把它們歸入軟中斷這一類。這類中斷有:
0號中斷——除數為零中斷;
1號中斷——單步中斷;
3號中斷——斷點中斷;
4號中斷——溢出中斷。