中斷類型標誌

在調用request_irq函數申請一個IRQ時,會傳入相應的中斷類型標誌。對於這些標誌新舊版本的內核實現是不完全相同的。

 

IRQF_DISABLED

3.16.7-ct7版本內核中此標誌是沒有地方用到的。此標誌表示中斷在處理的時候是關中斷的,不能被另外的中斷所打斷。(http://lwn.net/Articles/380931/)這篇文章裏有講到此標誌在新內核中被廢棄的原因。

之前老的內核中,按照中斷處理快慢,分爲快速中斷和慢速的中斷。對於慢速的中斷,在處理的時候是不能關中斷的,能夠被其他的中斷所中斷,這樣能夠防止處理耗時過長。快速中斷在處理的時候是關中斷的,不能被其他中斷所中斷,因爲認爲它處理的夠快。

 

在老的內核版本(我參考的內核版本是2.6.12.6)SA_INTERRUPT標誌起到和IRQF_DISABLED一樣的作用。

fastcall int handle_IRQ_event(unsigned int irqstruct pt_regs *regs,

    struct irqaction *action 

 

 if (!(action->flags & SA_INTERRUPT))  

  local_irq_enable();  

do  

  ret action->handler(irqaction->dev_idregs);  //執行註冊的handler

  if (ret == IRQ_HANDLED 

   status |= action->flags 

  retval |= ret 

  action action->next 

         while (action);  

 

handle_IRQ_event在do_IRQ中調用,在執行註冊的handler之前,會判斷註冊時有沒有設置SA_INTERRUPT標誌。如果沒有設置此標誌,就調用local_irq_enable函數開中斷。

 

之前由於硬件的問題、慢速的處理器以及開發人員能力的差異,導致慢速的中斷處理在現實情況中大量存在。現在隨着硬件的快速發展,已經能夠越來越快的處理中斷了。並且中斷的延遲處理機制,如下半部、中斷線程化都使得能夠將大量的工作從中斷處理程序中移出來。

 

IRQF_SHARED

此標誌用來表示一個IRQ是否允許在多個設備間共享。在之前使用8259中斷控制器是,一個8259只有8pin2個級聯也只能支持15個外部設備中斷,外設很多的情況下可能會需要多個設備共享一個IRQ

現在普遍使用的是APIC(高級可編程的中斷控制器),由IO APICLocal APIC組成。每個IO APIC支持24IRQ Line,多個IO APIC可以級聯。現在不推薦使用此標誌來註冊中斷。

 

發佈了40 篇原創文章 · 獲贊 12 · 訪問量 9萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章