![](/img/trans.png)
[英]Can a shared interrupt line in Linux have different interrupt handlers?
[英]How can I know which interrupt line is shared or not, and which interrupt line is free in Linux?
我將在Linux中編寫一個PCIe基本串行I / O卡驅動程序。
根據我的知識,通過配置空間,它提供了中斷線,並通過IRQF_SHARED
標志,我們能夠與相應的IRQ
線共享中斷處理程序。
但我的困惑是如何知道哪一行共享或不共享?
對於設備驅動程序,沒有任何有用的方法(尤其是沒有可移植方式)來確定中斷線是否實際共享,並且這可以通過加載/卸載其他驅動程序隨時更改。 PCI驅動程序必須始終假定它們的中斷可能是共享的。
注意:PCI Express設備應支持從不共享的MSI(消息信號中斷)。 如果可能,您的驅動程序應啟用MSI。 但是,不保證系統支持它們。
內核輔助探測
Linux內核提供了一個用於探測中斷號的低級設施。 它僅適用於非共享中斷,但大多數能夠在共享中斷模式下工作的硬件提供了更好的方法來查找配置的中斷號。 該工具由兩個函數組成,在<linux/interrupt.h>
(也描述了探測機制):
unsigned long probe_irq_on(void);
此函數返回未分配中斷的位掩碼。 驅動程序必須probe_irq_off
返回的位掩碼,並稍后將其傳遞給probe_irq_off
。 在此調用之后,驅動程序應安排其設備生成至少一個中斷。 int probe_irq_off(unsigned long);
在設備請求中斷后,驅動程序調用此函數,將probe_irq_on
先前返回的位掩碼作為其參數傳遞。 probe_irq_off
返回在“probe_on”之后發出的中斷號。如果沒有發生中斷,則返回0(因此,無法探測到IRQ 0,但是沒有自定義設備可以在任何一個上使用它支持的架構無論如何)。 如果發生多個中斷(模糊檢測),則probe_irq_off
返回負值。
程序員在調用probe_irq_on
之后應該小心在設備上啟用中斷,並在調用probe_irq_off
之前禁用它們。 此外,您必須記住在probe_irq_off
之后probe_irq_off
設備中的掛起中斷提供服務。
運行cat /proc/interrupt
。 在輸出的最右列,您應該在其中一條中斷線上看到您的設備。 如果共享,您將看到分配給該中斷的其他設備。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.