1. 程式人生 > >硬中斷、軟中斷

硬中斷、軟中斷

   這篇文章介紹一下linux中向量中斷、非向量中斷、底半部機制、軟中斷、硬中斷的內容,都是從網上搜過來的。
作業系統從使用者態切換到核心態需要藉助CPU 內部的軟體中斷。
向量中斷:為不同的中斷分配不同的中斷號,進入不同的入口地址,入中地址由硬體提供;
非向量中斷:同一個入口地址,進入後再由軟體判斷中斷標誌來識別具體哪個中斷。
底半部機制
①tasklet:使用比較簡單,只需要定義tasklet 及其處理函式並將兩者關聯。
   需要排程tasklet 的時候引用一個tasklet_schedule(&my_tasklet)函式就能使系統在適當的時候進行排程執行。
由於軟中斷必須使用可重入函式,設計上覆雜度變高,如果應用不需要在多個CPU 上並行執行,沒必要用軟中斷。
  a)一種型別的tasklet 只能執行在一個CPU 上,不能並行,只能序列執行。多個不同型別的tasklet 可以並行在多個CPU 上。
  b)軟中斷是靜態分配的,在核心編譯好之後,就不能改變。但tasklet 就靈活許多,可以在執行時改變(比如新增模組時)。
②工作佇列:與tasklet 相似,先定義work_struct 與處理函式, INIT_WORK()實現兩者的一個繫結。在頂半部中呼叫sschedule(&my_wq);
③軟中斷 
硬中斷:外設的中斷; 
軟中斷:通常是硬中斷服務程式對核心的中斷; 
訊號:是核心對某個程序的中斷。
軟中斷用softirq_action 表示,raise_softirq()觸發軟中斷;
  a)產生後並不是馬上執行,必須要等待核心的排程才能執行。軟中斷不能被自己打斷,只能被硬體中斷打斷(上半部)。
  b)可以併發執行在多個CPU 上(即使同一型別的也可以)。軟中斷必須設計為可重入的函式(允許多個CPU 同時操作),因此也需要使用自旋鎖來保護其資料結構。
   軟中斷和tasklet 運行於中斷上下文,不可睡眠;工作佇列運行於程序上下文,可以睡眠。