x86處理器如何處理MSI-X中斷請求PCIe設(shè)備發(fā)出MSI-X中斷請求的方法與發(fā)出MSI中斷請求的方法類似,都是向Message Address所在的地址寫Message Data字段包含的數(shù)據(jù)。
只是MSI-X中斷機制為了支持更多的中斷請求,在MSI-X Capablity結(jié)構(gòu)中存放了一個指向一組Message Address和 Message Data字段的指針,從而一個PCIe設(shè)備可以支持的MSI-X中斷請求數(shù)目大于32個,而且并不要求中斷向量號連續(xù)。
MSI-X機制使用的這組Message Address和 Message Data字段存放在PCIe設(shè)備的BAR空間中,而不是在PCIe設(shè)備的配置空間中,從而可以由用戶決定使用MSI-X中斷請求的數(shù)目。
當(dāng)系統(tǒng)軟件初始化PCIe設(shè)備時,如果該PCIe設(shè)備使用MSI-X機制傳遞中斷請求,需要對MSI-X Capability結(jié)構(gòu)指向的Message Address和Message Data字段進行設(shè)置,并使能MSI-X Enable位。x86處理器在此處的實現(xiàn)與PowerPC處理器有較大的不同。
Message Address字段和Message Data字段的格式
在x86處理器系統(tǒng)中,PCIe設(shè)備也是通過向Message Address寫入Message Data指定的數(shù)值實現(xiàn)MSI/MSI-X機制。在x86處理器系統(tǒng)中,PCIe設(shè)備使用的Message Adress字段和Message Data字段與PowerPC處理器不同。
1 PCIe設(shè)備使用Message Adress字段
在x86處理器系統(tǒng)中,PCIe設(shè)備使用的Message Address字段仍然保存PCI總線域的地址。
其中第31~20位,存放FSB Interrupts存儲器空間的基地址,其值為0xFEE。當(dāng)PCIe設(shè)備對0xFEEX-XXXX這段“PCI總線域”的地址空間進行寫操作時,MCH/ICH將會首先進行“PCI總線域”到“存儲器域”的地址轉(zhuǎn)換,之后將這個寫操作翻譯為FSB總線的Interrupt Message總線事務(wù),從而向CPU內(nèi)核提交中斷請求。
x86處理器使用FSB Interrupt Message總線事務(wù)轉(zhuǎn)發(fā)MSI/MSI-X中斷請求。使用這種方法的優(yōu)點是向CPU內(nèi)核提交中斷請求的同時,提交PCIe設(shè)備使用的中斷向量,從而CPU不需要使用中斷響應(yīng)周期從寄存器中獲得中斷向量。FSB Interrupt Message總線事務(wù)的詳細(xì)說明見下文。
Message Address字段其他位的含義如下所示。
?Destination ID字段保存目標(biāo)CPU的ID號,目標(biāo)CPU的ID與該字段相等時,目標(biāo)CPU將接收這個Interrupt Message。FSB Interrupt Message總線事務(wù)可以向不同的CPU提交中斷請求。
?RH(Redirection Hint Indication)位為0時,表示Interrupt Message將直接發(fā)向與Destination ID字段相同的目標(biāo)CPU;如果RH為1時,將使能中斷轉(zhuǎn)發(fā)功能。
?DM(Destination Mode)位表示在傳遞優(yōu)先權(quán)最低的中斷請求時,Destination ID字段是否被翻譯為Logical或者Physical APIC ID。在x86處理器中APIC ID有三種模式,分別為Physical、Logical和Cluster ID模式。
?如果RH位為1且DM位為0時,Destination ID字段使用Physical模式;如果RH位為1且DM位為1,Destination ID字段使用Logical模式;如果RH位為0,DM位將被忽略。
以上這些字段的描述與x86處理器使用的APIC中斷控制器相關(guān)。對APIC的詳細(xì)說明超出了本書的范圍,對此部分感興趣的讀者請參閱Intel 64 and IA-32 Architectures Software Developer’s Manual Volume 3A: System Programming Guide, Part 1。
2 Message Data字段
Trigger Mode字段為0b0x時,PCIe設(shè)備使用邊沿觸發(fā)方式申請中斷;為0b10時使用低電平觸發(fā)方式;為0b11時使用高電平觸發(fā)方式。
MSI/MSI-X中斷請求使用邊沿觸發(fā)方式,但是FSB Interrupt Message總線事務(wù)還支持Legacy INTx中斷請求方式,因此在Message Data字段中仍然支持電平觸發(fā)方式。但是對于PCIe設(shè)備而言,該字段為0b0x。
Vector字段表示這個中斷請求使用的中斷向量。FSB Interrupt Message總線事務(wù)在提交中斷請求的同時,將中斷向量也通知給處理器。
因此使用FSB Interrupt Message總線事務(wù)時,處理器不需要使用中斷響應(yīng)周期通過讀取中斷控制器獲得中斷向量號。與PowerPC的傳統(tǒng)方式相比,x86處理器的這種中斷請求的效率較高[①]。
值得注意的是,在x86處理器中,MSI機制使用的Message Data字段與MSI-X機制相同。但是當(dāng)一個PCIe設(shè)備支持多個MSI中斷請求時,其Message Data字段必須是連續(xù)的,因而其使用的Vector字段也必須是連續(xù)的,這也是在x86處理器系統(tǒng)中,PCIe設(shè)備支持多個MSI中斷請求的問題所在,而使用MSI-X機制有效避免了該問題。
Delivery Mode字段表示如何處理來自PCIe設(shè)備的中斷請求。
?該字段為0b000時,表示使用“Fixed Mode”方式。此時這個中斷請求將被Destination ID字段指定的CPU處理。
?該字段為0b001時,表示使用“Lowest Priority”方式。此時這個中斷請求將被優(yōu)先權(quán)最低的CPU處理。
當(dāng)使用“Fixed Mode”和“Lowest Priority”方式時,如果Vector字段有效,CPU接收到這個中斷請求之后,將使用Vector字段指定的中斷向量處理這些中斷請求;而當(dāng)Delivery Mode字段為其他值時,Message Data字段中所包含的Vector字段無效。
?該字段為0b010時,表示使用SMI方式傳遞中斷請求,而且必須使用邊沿觸發(fā),此時Vector字段必須為0。這個中斷請求將被Destination ID字段指定的CPU處理。
?該字段為0b100時,表示使用NMI方式傳遞中斷請求,而且必須使用邊沿觸發(fā),此時Vector字段和Trigger字段的內(nèi)容將被忽略。這個中斷請求將被Destination ID字段指定的CPU處理。
?該字段為0b101時,表示使用INIT方式傳遞中斷請求,Vector字段和Trigger字段的內(nèi)容將被忽略。這個中斷請求將被Destination ID字段指定的CPU處理。
?該字段為0b111時,表示使用INTR信號傳遞中斷請求且使用邊沿觸發(fā)。此時MSI中斷信息首先傳遞給中斷控制器,然后中斷控制器在通過INTR信號向CPU傳遞中斷請求,之后CPU在通過中斷響應(yīng)周期獲得中斷向量。
上文中PowerPC處理器使用的方法與此方法類似。而在x86處理器中多使用Interrupt Message總線事務(wù)進行MSI中斷信息的傳遞,因此這種模式很少被使用。
邊沿觸發(fā)和電平觸發(fā)是中斷請求常用的兩種方式。其中電平觸發(fā)指外部設(shè)備使用邏輯電平1(高電平觸發(fā))或者0(低電平觸發(fā)),提交中斷請求。使用電平或者邊沿方式提交中斷請求時,外部設(shè)備一般通過中斷線(IRQ_PIN#)與中斷控制器相連,其中多個外部設(shè)備可能通過相同的中斷線與中斷控制器相連(線與或者與門)。
外部設(shè)備在使用低電平觸發(fā),提交中斷請求的過程中,首先需要將IRQ_PIN#信號驅(qū)動為低。當(dāng)中斷控制器將該中斷請求提交給處理器,而且處理器將這個中斷請求處理完畢后,處理器將通過寫外部設(shè)備的某個寄存器來清除此中斷源,此時外部設(shè)備將不再驅(qū)動IRQ_PIN#信號線,從而結(jié)束整個中斷請求。
IRQ_PIN#信號線可以被多個外部設(shè)備共享,在這種情況之下,只有所有外部設(shè)備都不驅(qū)動IRQ_PIN#信號線時,IRQ_PIN#信號才為高電平。
采用電平觸發(fā)方式進行中斷請求的優(yōu)點是不會丟失中斷請求,而缺點是一個優(yōu)先權(quán)較高的中斷請求有可能會長期占用中斷資源,從而使其他優(yōu)先權(quán)較低的中斷不能被及時提交。因為優(yōu)先級別較高的中斷源有可能會持續(xù)不斷地驅(qū)動IRQ_PIN#信號。
而邊沿觸發(fā)使用上升沿(0到1)或者下降沿(1到0)作為觸發(fā)條件,但是中斷控制器并不是使用這個“邊沿”作為觸發(fā)條件。
中斷控制器使用內(nèi)部時鐘對IRQ_PIN#信號進行采樣,如果在前一個時鐘周期,IRQ_PIN#信號為0,而后一個時鐘周期,IRQ_PIN#信號為1,中斷控制器認(rèn)為外部設(shè)備提交了一個有效“上升沿”,中斷控制器會鎖定這個“上升沿”并向處理器發(fā)出中斷請求。
這也是外部設(shè)備至少需要將IRQ_PIN#信號保持一個時鐘采樣周期的原因,否則中斷控制器可能無法識別本次邊沿觸發(fā)的中斷請求,從而產(chǎn)生Spurious中斷請求。
外部設(shè)備使用“上升沿”進行中斷申請時,不需要持續(xù)地將IRQ_PIN#信號驅(qū)動為1,而只需要保證中斷控制器可以進行正確采樣這些中斷信號即可。在處理邊沿觸發(fā)中斷請求時,處理器不需要清除中斷源。
使用邊沿觸發(fā)可以有效避免“優(yōu)先級別”較高的中斷源長期占用IRQ_PIN#信號的情況,使用“下降沿”觸發(fā)進行中斷請求與“上升沿”觸發(fā)類似。
但是外部設(shè)備使用邊沿觸發(fā)方式時,有可能會丟失一些中斷請求。例如在一個處理器系統(tǒng)中,存在一個定時器,這個定時器使用上升沿觸發(fā)方式向中斷控制器定時提交中斷。
如果當(dāng)處理器正在處理這個定時器的上一個中斷請求時,將不會處理這個定時器發(fā)出的其他“邊沿”中斷請求,從而導(dǎo)致中斷丟失。而使用電平觸發(fā)方式不會出現(xiàn)這類問題,因為電平觸發(fā)方式是一個“持續(xù)”過程,處理器只有處理完畢當(dāng)前中斷,并清除相應(yīng)中斷源之后,才會處理下一個中斷源。
MSI中斷請求實際上和邊沿觸發(fā)方式非常類似,MSI中斷請求通過存儲器寫TLP實現(xiàn),這個寫動作是一個瞬間的動作,并不是一個持續(xù)請求,因此在x86處理器中MSI中斷請求使用邊沿觸發(fā)進行中斷請求。
還有一些外部設(shè)備可以通過I/O APIC進行中斷請求[②],這些I/O APIC接收的外部中斷需要標(biāo)明是使用邊沿或者電平觸發(fā),I/O APIC使用FSB Interrupt Message總線事務(wù)將中斷請求發(fā)向Local APIC,并由Local APIC向處理器提交中斷請求。
FSB Interrupt Message總線事務(wù)
與MPC8572處理器處理MSI中斷請求不同,x86處理器使用FSB的Interrupt Message總線事務(wù),處理PCIe設(shè)備的MSI/MSI-X中斷請求。
由上文所示,MPC8572處理器處理MSI中斷請求時,首先由MPIC中斷控制器截獲這個MSI中斷請求,之后由MPIC中斷控制器向CPU提交中斷請求,而CPU通過中斷響應(yīng)周期從MPIC中斷控制器的ACK寄存器中獲得中斷向量。
采用這種方式的主要問題是,當(dāng)一個處理器中存在多個CPU時,這些CPU都需要通過中斷響應(yīng)周期從MPIC中斷控制器的ACK寄存器中獲得中斷向量。在一個中斷較為密集的應(yīng)用中,ACK寄存器很可能會成為系統(tǒng)瓶頸。
而采用Interrupt Message總線事務(wù)可以有效地避免這種系統(tǒng)瓶頸,因為使用這種方式中斷信息和中斷向量將同時到達指定的CPU,而不需要使用中斷響應(yīng)周期獲得中斷向量。
x86處理器也具有通過中斷控制器提交MSI/MSI-X中斷請求的方法,在I/O APIC具有一個 “The IRQ Pin Assertion Register”寄存器,該寄存器地址為0xFEC00020[③],其第4~0位存放IRQ Number。系統(tǒng)軟件可以將PCIe設(shè)備的Message Address寄存器設(shè)置為0xFEC00020,將Meaasge Data寄存器設(shè)置為相應(yīng)的IRQ Number。
當(dāng)PCIe設(shè)備需要提交MSI中斷請求時,將向PCI總線域的0xFEC00020地址寫入Message Data寄存器中的數(shù)據(jù)。此時這個存儲器寫請求將數(shù)據(jù)寫入I/O APIC的The IRQ Pin Assertion Register中,并由I/O APIC將這個MSI中斷請求最終發(fā)向Local APIC,之后再由Local APIC通過INTR#信號向CPU提交中斷請求。
上述步驟與MPC8572處理器傳遞MSI中斷的方法類似。在x86處理器中,這種方式基本上已被棄用。說明x86處理器如何使用FSB總線的Interrupt Message總線事務(wù),向CPU提交MSI/MSI-X中斷請求。
PCIe設(shè)備在發(fā)送MSI/MSI-X中斷請求之前,系統(tǒng)軟件需要合理設(shè)置PCIe設(shè)備MSI/MSI-X Capability寄存器,使Message Address寄存器的值為0xFEExx00y[④],同時合理地設(shè)置Message Data寄存器Vector字段。
PCIe設(shè)備提交MSI/MSI-X中斷請求時,需要向0xFEExx00y地址寫Message Data寄存器中包含的數(shù)據(jù),并以存儲器寫TLP的形式發(fā)送到RC。如果ICH收到這個存儲器寫TLP時,將通過DMI接口將這個TLP提交到MCH。
MCH收到這個TLP后,發(fā)現(xiàn)這個TLP的目的地址在FSB Interrupts存儲器空間中,則將PCIe總線的存儲器寫請求轉(zhuǎn)換為Interrupt Message總線事務(wù),并在FSB總線上廣播。
FSB總線上的CPU,根據(jù)APIC ID信息,選擇是否接收這個Interrupt Message總線事務(wù),并進入中斷狀態(tài),之后該CPU將直接從這個總線事務(wù)中獲得中斷向量號,執(zhí)行相應(yīng)的中斷服務(wù)例程,而不需要從APIC中斷控制器獲得中斷向量。與PowerPC處理器的MPIC中斷控制器相比,這種方法更具優(yōu)勢。
編輯:jq
-
處理器
+關(guān)注
關(guān)注
68文章
19259瀏覽量
229653 -
cpu
+關(guān)注
關(guān)注
68文章
10854瀏覽量
211589 -
APIC
+關(guān)注
關(guān)注
0文章
4瀏覽量
7250
原文標(biāo)題:x86處理器如何處理MSI-X中斷請求
文章出處:【微信號:gh_339470469b7d,微信公眾號:FPGA與數(shù)據(jù)通信】歡迎添加關(guān)注!文章轉(zhuǎn)載請注明出處。
發(fā)布評論請先 登錄
相關(guān)推薦
評論