1. 程式人生 > >關於中斷服務函式帶來返回值的思考

關於中斷服務函式帶來返回值的思考

從本質上來講,中斷是一種電訊號,當裝置有某種事件發生時,它就會產生中斷,通過匯流排把電訊號傳送給中斷控制器。如果中斷的線是啟用的,中斷控制器就把電訊號傳送給處理器的某個特定引腳。處理器於是立即停止自己正在做的事,跳到中斷處理程式的入口點,進行中斷處理。

(1) 硬中斷

由與系統相連的外設(比如網絡卡、硬碟)自動產生的。主要是用來通知作業系統系統外設狀態的變化。比如當網絡卡收到資料包的時候,就會發出一箇中斷。我們通常所說的中斷指的是硬中斷(hardirq)。

(2) 軟中斷

為了滿足實時系統的要求,中斷處理應該是越快越好。linux為了實現這個特點,當中斷髮生的時候,硬中斷處理那些短時間就可以完成的工作,而將那些處理事件比較長的工作,放到中斷之後來完成,也就是軟中斷(softirq)來完成。

(3) 中斷巢狀

Linux下硬中斷是可以巢狀的,但是沒有優先順序的概念,也就是說任何一個新的中斷都可以打斷正在執行的中斷,但同種中斷除外。軟中斷不能巢狀,但相同型別的軟中斷可以在不同CPU上並行執行。

(4) 軟中斷指令

int是軟中斷指令。

中斷向量表是中斷號和中斷處理函式地址的對應表。

int n - 觸發軟中斷n。相應的中斷處理函式的地址為:中斷向量表地址 + 4 * n。

(5)硬中斷和軟中斷的區別

軟中斷是執行中斷指令產生的,而硬中斷是由外設引發的。

硬中斷的中斷號是由中斷控制器提供的,軟中斷的中斷號由指令直接指出,無需使用中斷控制器。

硬中斷是可遮蔽的,軟中斷不可遮蔽。

硬中斷處理程式要確保它能快速地完成任務,這樣程式執行時才不會等待較長時間,稱為上半部。

軟中斷處理硬中斷未完成的工作,是一種推後執行的機制,屬於下半部。 

<p style="margin-top: 0px; margin-bottom: 0px; padding-top: 0px; padding-bottom: 0px; font-family: Arial; line-height: 26px;"><strong>註冊中斷處理函式</strong></p><p style="margin-top: 0px; margin-bottom: 0px; padding-top: 0px; padding-bottom: 0px; font-family: Arial; line-height: 26px;">註冊中斷處理函式:</p><p style="margin-top: 0px; margin-bottom: 0px; padding-top: 0px; padding-bottom: 0px; font-family: Arial; line-height: 26px;">/**
 * irq: 要分配的中斷號
 * handler: 要註冊的中斷處理函式
 * flags: 標誌(一般為0)
 * name: 裝置名(dev->name)
 * dev: 裝置(struct net_device *dev),作為中斷處理函式的引數
 * 成功返回0
 */
</p>

所以中斷服務函式帶不帶形參和返回值主要是看中斷是發生在裸機上還是實時系統中。