天天看點

PCI-PCIE中斷機制之三

一個簡單的PCI總線INTx中斷實作流程,如下圖所示。

1.     首先,PCI裝置通過INTx邊帶信号産生中斷請求,經過中斷控制器(Interrupt Controller,PIC)後,轉換為INTR信号,并直接發送至CPU;

2.     CPU收到INTR信号置位後,意識到了中斷請求的發生,但是此時并不知道是什麼中斷請求。于是通過一個特殊的指令來查詢中斷請求資訊,該過程一般被稱為中斷應答(Interrupt Acknowledge);

3.     該特殊指令被發送至PIC後,PIC會傳回一個8bits的中斷向量(Interrupt Vector)值給CPU。該中斷向量值與其發送的INTR請求是對應的;

4.     CPU收到來自PIC的中斷向量值後,會去其Memory中的中斷向量表(Interrupt Table)中查找對應的中斷服務程式(Interrupt Service Routines,ISR)在Memory的位置;

5.     然後CPU讀取ISR程式,進而處理該中斷。

PCI-PCIE中斷機制之三
PCI-PCIE中斷機制之三

上面的例子主要是基于早期的單核CPU設計的,并沒有考慮到目前多核CPU的情況。是以,在後續的PCI Spec中,将PIC替換為IO APIC(Advanced Programmed Interrupt Controller)。如下圖所示:

PCI-PCIE中斷機制之三
PCI-PCIE中斷機制之三
PCI-PCIE中斷機制之三

實際上,在PCIe總線中,傳統的中斷機制(INTx)已經很少被使用,很多應用甚至直接将該功能禁止了。無論是在PCI總線(V2.3及以後的版本),還是PCIe總線中,都可以通過配置空間中的配置指令寄存器(Configuration Command Register來禁止INTx中斷機制),如下圖所示。不過,需要特别注意的是,雖然該bit的名稱為中斷禁止(Interrupt Disable),但是其隻會影響INTx,對MSI/MSI-X不會造成影響。因為MSI/MSI-X的使能(或禁止)是通過配置空間中的MSI/MSI-X Capability Command Register來實作的,并且一旦使能了MSI/MSI-X,PCI總線/PCIe總線便會自動地禁止INTx。

PCI-PCIE中斷機制之三

并且可以通過配置狀态寄存器的中斷狀态(Interrupt Status)bit來确定目前的中斷狀态,如下圖所示:

PCI-PCIE中斷機制之三

INTx相關的寄存器在配置空間的位置如下圖所示,Interrupt Pin和Interrupt Line分别定義了中斷邊帶信号引腳号(INTA#~INTD#)和中斷向量号(IRQ0~IRQ255)。

PCI-PCIE中斷機制之三

然而,PCIe總線繼承了PCI總線的INTx中斷機制,但是在實際的PCIe裝置之間的中斷資訊傳輸中使用的并非邊帶信号INTx,而是基于消息(Message)的。其中Assert_INTx消息表示INTx信号的下降沿。Dessert_INTx消息表示INTx信号的上升沿。當發送這兩種消息時,PCIe裝置還會将配置空間的相關中斷狀态bit的值更新。對于PCIe-PCI(X)橋裝置來說,會将接收到的來自PCI/PCI-X總線的INTx信号轉換為消息,在往上級發送。一個簡單的例子如下圖所示:

PCI-PCIE中斷機制之三

INTx消息的格式為:

PCI-PCIE中斷機制之三

橋裝置中的INTx消息的類型與裝置号的映射關系如下圖所示:

PCI-PCIE中斷機制之三

對應的,一個簡單的例子如下:

PCI-PCIE中斷機制之三

當多個裝置使用同一個中斷信号線時,隻有先置位的裝置會被中斷控制器響應。但是該中斷信号線,并不會因為其中一個裝置的中斷請求得到響應便被清除,而是會等到所有的發送請求的裝置的中斷請求都得到了響應之後。如下圖所示:

PCI-PCIE中斷機制之三