1掸掏、為什么需要中斷
? ? ? ? 為了能夠讓一些優(yōu)先級高的事務(wù)得到優(yōu)先處理,PCI總線支持外設(shè)中斷用以提高總線性能娃殖。
2衰粹、中斷的多種方式
? ??????PCIe總線繼承了PCI總線的所有中斷特性(包括INTx和MSI/MSI-X)
3、PCIe中斷--INTx
? ??????PCI總線使用INTA#踪危、INTB#洗贰、INTC#和INTD#信號向處理器發(fā)出中斷請求。這些中斷請求信號為低電平有效陨倡,并與處理器的中斷控制器連接。在PCI體系結(jié)構(gòu)中许布,這些中斷信號屬于邊帶信號(Sideband Signals)兴革,PCI總線規(guī)范并沒有明確規(guī)定在一個處理器系統(tǒng)中如何使用這些信號,因?yàn)檫@些信號對于PCI總線是可選信號蜜唾。所謂邊帶信號是指這些信號在PCI總線中是可選信號杂曲,而且只能在一個處理器系統(tǒng)的內(nèi)部使用,并不能離開這個處理器環(huán)境袁余。
3.1擎勘、PCI INTx中斷流程
? ??????一個簡單的PCI總線INTx中斷實(shí)現(xiàn)流程,如下圖所示(單核CPU)颖榜。
1棚饵、首先煤裙,PCI設(shè)備通過INTx邊帶信號產(chǎn)生中斷請求,經(jīng)過中斷控制器(Interrupt Controller噪漾,PIC)后硼砰,轉(zhuǎn)換為INTR信號,并直接發(fā)送至CPU欣硼;
2题翰、CPU收到INTR信號置位后,意識到了中斷請求的發(fā)生诈胜,但是此時并不知道是什么中斷請求豹障。于是通過一個特殊的指令來查詢中斷請求信息,該過程一般被稱為中斷應(yīng)答(Interrupt Acknowledge)焦匈;
3血公、該特殊指令被發(fā)送至PIC后,PIC會返回一個8bits的中斷向量(Interrupt Vector)值給CPU括授。該中斷向量值與其發(fā)送的INTR請求是對應(yīng)的坞笙;
4、CPU收到來自PIC的中斷向量值后荚虚,會去其Memory中的中斷向量表(Interrupt Table)中查找對應(yīng)的中斷服務(wù)程序(Interrupt Service Routines薛夜,ISR)在Memory的位置;
5版述、然后CPU讀取ISR程序梯澜,進(jìn)而處理該中斷。
? ? ? ? 多核CPU的簡單圖示如下:
4渴析、PCIe中斷-MSI/MSI-X
? ??????對于PCIE設(shè)備晚伙,一般支持MSI中斷和MSIX中斷,MSI和MSIX中斷都是通過對某個映射內(nèi)存區(qū)域?qū)憯?shù)據(jù)(寫的地址為Message Addr俭茧,寫的數(shù)據(jù)為Message Data)咆疗,從而觸發(fā)基于信息的中斷。MSI和MSIX的差異點(diǎn)主要有兩點(diǎn):
1母债、產(chǎn)生MSI中斷的內(nèi)存映射區(qū)在PCIE設(shè)備的配置空間午磁,而產(chǎn)生MSIX中斷的內(nèi)存映射區(qū)在PCIE設(shè)備的BAR空間;
2毡们、MSI中斷最多支持32個迅皇,且要求申請的中斷連續(xù),而MSIX中斷可支持的比較多(2048)衙熔,不要求申請的中斷連續(xù)登颓;
????????MSI有四種類型如下圖所示:
????????其中Capability ID的值是只讀的,05h表示支持MSI功能红氯。
? ??????Next Capability Pointer也是只讀的框咙,其用于查找下一個Capability Structure的位置咕痛,其值為00h則表示到達(dá)Linked List的最后了。
????????當(dāng)Mask Bits將相關(guān)的中斷向量(Interrupt Vector)屏蔽后扁耐,該MSI將不會被發(fā)送暇检。軟件可以通過這種方式來使能或者禁止某些MSI的發(fā)送。
????????如果相關(guān)中斷向量沒有被屏蔽婉称,則如果發(fā)生了相關(guān)中斷請求块仆,這時Pending Bits中的相應(yīng)bit則會被置位。一旦中斷信息被發(fā)出王暗,則該bit會立即被清零悔据。
????? MSIX中斷相關(guān)寄存器如下所示: