跳至內容

消息信號中斷

維基百科,自由的百科全書

消息信號中斷(MSI)作為一種中斷觸發機制,主要通過帶內發送特殊消息來代替傳統通過專用中斷線發送帶外信號的方法。雖然該方法在設備端實現較為複雜,但相較於基於物理引腳的帶外中斷信號傳輸機制,該技術具有諸多顯著優勢,例如能夠顯著提升中斷處理性能。這與傳統中斷請求(IRQ)機制形成了鮮明對比,展現出更高效的中斷處理能力。

自PCI匯流排2.2版本起,以及後續推出的PCI Express匯流排中,均支持消息信號中斷技術。此外,某些非PCI架構的系統也採用了消息信號中斷機制。

概述

[編輯]

傳統設備通過專用中斷線向主機發送信號,這種帶外控制方式依賴獨立於數據通道的物理引腳。消息信號中斷(MSI)則將這一機制移至數據通道內部(帶內),通過在主數據路徑上傳輸特殊消息觸發中斷,省去了額外的硬體線路。例如,設備通過向特定內存映射地址寫入少量數據來通知中斷請求,隨後晶片組解析該數據並傳遞至處理器,完成中斷響應。需注意的是,MSI過程中傳遞的數據僅用於確定中斷類型及目標處理器,並不能作為設備向處理程序發送額外信息的渠道——這一誤解常源於對內存寫入功能的混淆。

採用MSI技術的系統往往通過軟體模擬傳統硬體機制。以PCI Express匯流排為例,其完全摒棄物理中斷引腳,藉助預定義消息格式實現中斷觸發與釋放的帶內模擬。類似地,惠普GSC設備也通過直接寫入內存空間中的中斷暫存器生成信號,而無需物理線路參與。HyperTransport協議同樣集成MSI技術,進一步驗證了該方案在不同架構中的適用性。這類實現不僅減少了硬體複雜度,也增強了中斷系統靈活性,體現出軟硬體協同設計的優勢。

優點

[編輯]

儘管在設備中實現起來更為複雜,但消息信號中斷相較於基於引腳的傳統帶外中斷信號機制,展現出了若干顯著優勢。從機械結構的角度來看,減少引腳數量使得連接器更為簡潔、成本更低且可靠性更高。雖然這對標準PCI連接器並無明顯益處,但PCI Express接口卻充分利用了這一節省,體現了其設計的先進性。

MSI顯著增加了可用的中斷數量。在傳統PCI架構中,每張卡最多只能支持四個中斷(且由於這些中斷在所有卡之間共享,大多數情況下每張卡僅使用一個),而MSI技術則使得每張卡能夠支持數十個中斷,這在需要大量中斷處理的應用場景中尤為有利。

此外,MSI還帶來了一小部分性能上的優勢。在軟體層面,基於引腳的中斷可能會與內存的延遲寫入發生競態問題。具體來說,PCI設備在將數據寫入內存後,會隨即發送一個中斷信號以表明DMA(直接內存訪問)寫操作已完成。然而,PCI橋接器或內存控制器可能會為了不干擾其他內存操作而緩存該寫請求,導致中斷信號在DMA寫操作實際完成之前到達,處理器因而可能讀取到內存中的陳舊數據。為避免這種競態,中斷處理程序不得不從設備中讀取數據以確認DMA寫操作確實已完成,這一讀取操作會帶來一定的性能損耗。而MSI寫入操作無法超越DMA寫入,因此從根本上消除了這一競態問題。

中斷類型

[編輯]

PCI規範中定義了兩項可選的擴展功能以支持消息信號中斷,分別是MSI和MSI-X。而PCI Express則自行設計了一套基於消息的機制,用以模擬傳統的PCI中斷方式。

MSI

[編輯]

MSI(首次定義於PCI 2.2版本)允許設備分配1、2、4、8、16或32個中斷。設備被配置為向一個特定地址寫入數據(此地址通常是中斷控制器中的一個控制暫存器),並使用一個16位的數據字來標識自身。中斷號被添加到此數據字中,用以具體指明是哪一個中斷。部分平台,如Windows,並未充分利用全部32個中斷,而是僅使用最多16個中斷。

MSI-X

[編輯]

MSI-X(首次定義於PCI 3.0版本)允許設備分配多達2048個中斷。人們發現,最初MSI採用的單一地址方案在某些架構上存在限制,尤其是在將不同中斷精準定位到不同處理器方面顯得力不從心,而這一點在某些高速網絡應用中尤為重要。MSI-X不僅支持更多的中斷數量,還為每個中斷配備了獨立的目標地址和數據字。不過,並非所有支持MSI-X的設備都能實際提供2048個中斷。

MSI中的可選功能(如64位地址支持和中斷屏蔽)在MSI-X中也成為了必須支持的特性。

PCI Express傳統中斷模擬

[編輯]

PCI Express本身並不具備物理中斷引腳,但它通過專門的PCI Express消息(例如Assert_INTA和Deassert_INTC)來模擬PCI的4個物理中斷引腳。由於這一機制基於消息(在PCI Express層),它在一定程度上提供了PCI層MSI機制的優點,但並非全部:每個設備的4個虛擬中斷引腳不再在匯流排上共享(儘管PCI Express控制器內部可能仍會合併傳統中斷),並且中斷狀態的改變不再天生地受到競爭條件的影響。

PCI Express允許設備使用這些傳統中斷消息,以保持與PCI驅動程序的軟體兼容性,但同時要求這些設備在PCI層也必須支持MSI(消息信號中斷)或MSI-X(擴展消息信號中斷)。

x86系統

[編輯]

英特爾系統中,即使是在單核系統上,也必須啟用LAPIC(本地高級可程式中斷控制器),才能使PCI(以及PCI Express)的MSI/MSI-X正常工作。在這些系統中,MSI的處理方式是將中斷向量直接寫入需要處理中斷的處理器/核心的LAPIC。2009年的英特爾LAPIC支持最多224個基於MSI的中斷。根據2009年英特爾使用Linux進行的基準測試,與I/O APIC(輸入輸出高級可程式中斷控制器)傳遞相比,使用MSI將中斷延遲減少了近三倍。

作業系統支持

[編輯]

在微軟作業系統家族中,Windows Vista及後續版本均支持MSI和MSI-X。這一支持功能是在2004年左右的Longhorn開發周期中引入的。然而,在更早期的版本如Windows XP或Windows Server 2003中,並不支持MSI功能。

2005年發布的Solaris Express 6/05增加了對MSI和MSI-X的支持,這是其新設備驅動程序接口(DDI)中斷框架的一部分。

2008年發布的FreeBSD 6.3和7.0版本增加了對MSI和MSI-X的支持。

2011年發布的OpenBSD 5.0版本增加了對MSI的支持,而在隨後的6.0版本中,又進一步添加了對MSI-X的支持。

Linux系統大約在2003年獲得了對MSI和MSI-X的支持。然而,在2.6.20版本之前的內核中,MSI/MSI-X的實現存在嚴重的缺陷和限制。

Haiku系統大約在2010年實現了對MSI的支持,隨後在2013年又增加了對MSI-X的支持。

NetBSD 8.0版本於2018年發布,新增了對MSI和MSI-X的支持。

VxWorks 7系統支持MSI和MSI-X。

參考資料

[編輯]