在調用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 irq, struct pt_regs *regs, struct irqaction *action) { if (!(action->flags & SA_INTERRUPT)) local_irq_enable(); do { ret = action->handler(irq, action->dev_id, regs); //執行註冊的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只有8個pin,2個級聯也只能支持15個外部設備中斷,外設很多的情況下可能會需要多個設備共享一個IRQ。
現在普遍使用的是APIC(高級可編程的中斷控制器),由IO APIC和Local APIC組成。每個IO APIC支持24個IRQ Line,多個IO APIC可以級聯。現在不推薦使用此標誌來註冊中斷。