2

我正在實現一個PCIe驅動程序,並且我想了解中斷可以或應該被啓用/禁用的級別。我故意不指定操作系統,因爲我認爲它應該適用於任何平臺。通過I級表示以下含義:我們是否必須在每個層上啓用或禁用PCI中斷,或者只在最接近硬件的位置啓用或禁用PCI中斷?

  • OS特定的中斷處理框架
  • 中斷可以被禁用,或在PCI/PCIe配置空間寄存器啓用,例如命令寄存器
  • 中斷還可以在設備級別被屏蔽,比如我們可以 配置設備不會觸發特定的中斷到主機

據我瞭解,正在對用於PCIe任何中斷類型(INTx仿真,MSI或MSI-X),它必須交付給主機操作系統。所以我的問題是 - 我們實際上是否必須在每一層啓用或禁用中斷,或者只有在最接近硬件的情況下才足夠,例如,在相關的PCI寄存器中?

回答

1

禁用各個級別的中斷通常有完全不同的目的。

禁用中斷:

  • 在OS(真的,這意味着CPU在) - 這通常是大約避免競態條件。特別是,如果CPU發生中斷,特定代碼段可能會發生狀態/內存損壞,那麼該代碼段將需要禁用中斷處理。中斷處理程序不能獲取正常的鎖(根據定義,它們不能被掛起),並且它們不能嘗試獲取由當前在相同 CPU上調度的線程保持的自旋鎖(因爲該線程被阻止通過相同的中斷處理程序進行處理!),所以使用中斷處理程序確保數據安全可能會非常棘手。及時處理中斷通常是一件好事,因此您希望將您編寫的任何代碼中的這些部分最小化。儘可能多地處理中斷處理,以儘可能避免這種情況。二級中斷處理程序實際上只是普通OS線程上的回調函數,它沒有任何主中斷處理程序的限制。
  • PCI/PCIe配置 - 這是我的理解,這是主要是路由中斷,是你通常做一次的東西時,你的驅動程序加載(或由客戶端激活),並再次當你的驅動程序卸載(或者是停用)。這也可能會受到電源管理事件的影響。在某些操作系統中,當您通過更高級別的API激活PCI設備中斷時,實際爲您處理PCI(e)級別。
  • 設備上 - 這通常是一種優化措施,以避免在不需要中斷時中斷CPU。最常見的情況是設備上發生事件,因此會產生中斷。如果驅動程序需要進行任何處理,驅動程序的主中斷處理程序會檢查設備寄存器。如果是,則禁用設備上的中斷,並安排驅動程序的中繼中斷處理程序運行。操作系統最終運行輔助處理程序,該處理程序處理設備提供的任何信息,直至耗盡所有事情。然後它使再次中斷,如果有任何待處理的工作,並且如果沒有任何工作,它會終止。 (如果在最後一次檢查中有要處理的項目,它將重新禁用中斷並從頭開始重新開始。)這個想法是,直到第二個中斷處理程序完成處理,確實沒有任何一點觸發主要中斷處理程序,並且浪費資源,如果有其他事件到達,因爲司機已經在忙於處理事件隊列。重新啓用中斷之後的最終檢查是爲了避免事件到達和重新啓用中斷之間的競爭狀態。

我希望能回答你的問題。

+0

這有助於理解,謝謝。您能否澄清以下內容:如果司機選擇使用例如INTx中斷範例,是否應該禁用MSI/MSI-X中斷傳送(因爲可以通過MSI/MSIX功能PCI寄存器)?這同樣適用於選擇MSI時禁用INTx嗎?在Linux的情況下,當調用pci_msi_enable/pci_msix_enable時,看起來它是由PCI層完成的。這是可選的,並取決於操作系統? – Mark

+1

標準化的PCI功能寄存器通常由操作系統的PCI支持負責。當您的驅動程序聲明設備並向操作系統註冊其中斷處理程序時,您通常可以選擇MSI或MSIX。操作系統需要知道你正在使用什麼,所以它可以在適當的時候調用你的處理程序,所以它也會執行PCI配置。但是請檢查你的操作系統的文檔/源代碼是否有任何它期望你做的事情。如果您的設備具有用於不同類型事件的自定義MSIX矢量選擇寄存器,則需要在驅動程序中處理這些寄存器。希望有幫助嗎? – pmdj

+0

謝謝,這使得它更清晰。當MSI/MSIX處於活動狀態時,PCI/PCIe規範是否需要禁用INTx?我一直在尋找這個規格,但沒有找到。畢竟,我想只有一箇中斷模式應該是激活的。 – Mark

相關問題