2011-01-19 74 views

回答

3

由於幾個原因,中斷處理程序具有返回值。

  1. 中斷向量可以在多個設備之間共享。通過返回IRQ_NONE/IRQ_HANDLED,中斷處理程序可以指示中斷是否來自它特別感興趣的設備。如果返回IRQ_NONE,則應該調用列表中的下一個處理程序。
  2. 即使不共享IRQ,中斷處理程序也可以向中斷子系統指出處理中斷時出現了問題,並且應該禁用它以防止系統從irq循環掛起。
+0

`IRQ_WAKE_THREAD`也可用於延遲處理更新的Linux內核。也就是說,它表示當前進程可能被中斷以執行中斷的一個*慢*部分。 – 2014-11-19 20:57:27

1

中斷處理程序不是中斷向量。中斷向量是觸發中斷時處理器跳轉到的代碼。這是一個粗略的簡化,但這裏是它的外觀:

interrupt_vector { 
    num = check_interrupt_number() 
    f = get_interrupt_handler_func(num); 
    d = get_interrupt_handler_data(num); 
    /* call interrupt handler */ 
    ret = f(d); 
    } 

所以處理程序和數據一起登記,並中斷向量代碼調用registererd處理程序,通過註冊數據,並檢查返回值。 當然,這裏我們只有一級處理程序,但是您可以有多個處理程序,例如所有PCI Irq的處理程序,它們輪流檢查特定PCI irq的註冊處理程序,並最終調用它以傳遞註冊數據等。 ..

當然,真正的代碼往往要複雜得多。您可以嘗試使用lxr link來瀏覽Linux內核源代碼。

0

中斷矢量代碼與多個附接的中斷處理程序(OS特定的)到一個中斷處理程序—可以返回一個值(其通常進入像EAX在x86的寄存器),因此,矢量碼可以管理一連串的處理程序。