關(guān)鍵詞:中斷;MSI;RISC-V; 硬件輔助虛擬化;IOMMU
中圖分類號:TP332 文獻(xiàn)標(biāo)識碼:A
文章編號:1009-3044(2024)28-0095-04
0 引言
RISC-V因其開放性和先進(jìn)性而備受關(guān)注。自主研發(fā)基于RISC-V指令集的CPU已成為一種新趨勢,為實現(xiàn)芯片的自主可控提供了新方向。中斷是處理器設(shè)計中十分重要的組成部分,它可以通過在特定事件發(fā)生時暫停當(dāng)前任務(wù)的執(zhí)行,轉(zhuǎn)而處理該事件,從而提高處理器的處理效率[1]。在虛擬化技術(shù)中,準(zhǔn)確且高效的中斷處理方式也是虛擬化技術(shù)研究的重要方向[2]。
MSI相比于傳統(tǒng)的線中斷具有較強(qiáng)的拓展性,更低的延遲,通常被PCIE等高性能外設(shè)使用[3]。當(dāng)前廣泛應(yīng)用的RISC-V 外部中斷控制器PLIC[1]并不能對MSI直接處理,需要通過硬件將MSI轉(zhuǎn)換為線中斷。這種處理方式不僅需要額外的硬件開銷,還會導(dǎo)致在中斷虛擬化時頻繁的特權(quán)模式切換,極大地影響了處理器的虛擬化性能[4]。
本文基于RISC-V AIA(Advanced Interrupt Archi?tecture) 協(xié)議,首次提出了一種RISC-V架構(gòu)下的MSI 硬件輔助中斷虛擬化設(shè)計。本設(shè)計提供了專門的MSI 中斷控制器(IMSIC) [5]和IOMMU[6],可以作為IP集成到RISC-V架構(gòu)的處理器中。本設(shè)計可以直接對MSI接收處理,并且在中斷虛擬化時減少VMM的參與,將中斷直通到虛擬機(jī)[7],為提升虛擬機(jī)中斷響應(yīng)效率提供了硬件支持。
1 頂層結(jié)構(gòu)設(shè)計
本文設(shè)計主要由IOMMU 和IMSIC 兩大組件構(gòu)成。IOMMU的主要功能是將指向虛擬地址的MSI重定向到真實的物理地址,IMSIC負(fù)責(zé)接收MSI和發(fā)送中斷通知。圖1展示了設(shè)計的頂層結(jié)構(gòu)。
系統(tǒng)中IOMMU 的存在使得在虛擬機(jī)中運行的guest OS可以直接控制I/O設(shè)備,而只需很少的VMM 參與。直接控制設(shè)備的guest OS使用客戶物理地址(GPA) 對設(shè)備進(jìn)行編程。當(dāng)設(shè)備用這些地址發(fā)送MSI 時,IOMMU根據(jù)VMM提供的地址轉(zhuǎn)換成數(shù)據(jù)結(jié)構(gòu),將這些GPA轉(zhuǎn)換為HPA(實際物理地址)。MSI經(jīng)過IOMMU的地址轉(zhuǎn)換,得到HPA,然后通過系統(tǒng)總線將中斷信息寫入IMSIC的中斷文件的MSI接收區(qū)域中。
每個IMSIC都對應(yīng)特定的硬件線程(hart) 。單個IMSIC由多個中斷文件構(gòu)成,這些中斷文件是接收和處理MSI的硬件資源的集合。不同的hart特權(quán)態(tài)對應(yīng)不同的中斷文件。本文討論的是虛擬中斷,每個中斷的目標(biāo)是guest OS。因此,為每個guest OS分配相應(yīng)的客戶中斷文件是必要的。在本文后續(xù)提到的設(shè)計中,只討論IMSIC的客戶中斷文件。IMSIC的客戶中斷文件負(fù)責(zé)接收MSI,并管理中斷狀態(tài)信息,將優(yōu)先級最高的中斷信息發(fā)送到CSR hgeip 對應(yīng)位置。CSRhgeip記錄虛擬機(jī)的中斷通LvKPc6lLRkvawYCBc+BoOQ==知狀態(tài),每一位對應(yīng)一個獨立的虛擬機(jī)。這些中斷狀態(tài)隨后會被匯總到CSRhip的VSEIP字段中。如果虛擬機(jī)處于活躍狀態(tài),系統(tǒng)會將中斷直接傳遞給虛擬機(jī)。如果虛擬機(jī)不活躍,中斷信息將被保存在hgeip中,系統(tǒng)可以選擇喚醒虛擬機(jī),或等到虛擬機(jī)投入運行時,再將中斷信息注入到虛擬機(jī)。AIA協(xié)議中規(guī)定hart采用CSR指令間接訪問IMSIC 中斷文件的寄存器資源。CSR vsiselect 和vsireg作為間接訪問的窗口,VGEIN信號用于在多個客戶中斷文件中選擇匹配的中斷文件,以便與之進(jìn)行交互。
2 子模塊硬件設(shè)計
下文將分別介紹IOMMU和IMSIC組件的設(shè)計。
2.1 IOMMU的設(shè)計
IOMMU的頂層結(jié)構(gòu)如圖2所示。IOMMU內(nèi)部主要包括TCU(轉(zhuǎn)換控制單元)和IOATC(IOMMU地址轉(zhuǎn)換緩存)兩個關(guān)鍵組成部分。在外部接口方面,設(shè)計采用APB總線接口用于軟件對寄存器信息的訪問,而AXI 總線的讀通道則用于進(jìn)行IOMMU 的訪存操作。此外,外部接口還包括MSI重映射請求和轉(zhuǎn)換完成的信號。
在讀取特定數(shù)據(jù)時,傳統(tǒng)的多級頁表訪問方法需要多次訪問主存,導(dǎo)致顯著的時間開銷。為了提高IOMMU的性能,設(shè)計中引入了IOATC,它通過緩存設(shè)備上下文(DC) 和MSI頁表項(MSIPTE) 來減少對主存的訪問需求。該緩存采用全相聯(lián)結(jié)構(gòu),有效提升命中率。具體來說,設(shè)備上下文的緩存項使用輸入的de?vice_id 作為標(biāo)簽;而MSIPTE 緩存項則使用輸入的GPA和從DC中獲取的客戶軟上下文標(biāo)識作為標(biāo)簽。
為了解決緩存一致性問題,IOMMU采用隊列數(shù)據(jù)結(jié)構(gòu),并通過與軟件的交互來維護(hù)一致性。當(dāng)緩存項需要更新或失效時,軟件會向命令隊列發(fā)送失效命令。IOMMU會根據(jù)命令中的標(biāo)志信息,對相關(guān)緩存項進(jìn)行失效處理。
DC將設(shè)備與地址空間關(guān)聯(lián),并保存用于地址轉(zhuǎn)換的設(shè)備參數(shù)。IOMMU使用24位的設(shè)備硬件標(biāo)識符(device_id)遍歷設(shè)備目錄表(DDT) ,以定位到相應(yīng)的DC。DDT是一種基數(shù)樹的數(shù)據(jù)結(jié)構(gòu)。device_id被分為三段,分別標(biāo)記為DDI[2]、DDI[1]、DDI[0],以進(jìn)行3 級查表。設(shè)備目錄表指針存儲在ddtp 寄存器中。IOMMU使用高位字段DDI[2]查表,獲取非葉項。在非葉項中,保存著下一級頁表的物理頁編號(PPN) 。第二級查表與第一級類似,而第三級查表則得到葉項,其中葉項實際為查找的DC 的內(nèi)容,由DDI[0]索引。對于DC的查找,本文的設(shè)計主要采用狀態(tài)機(jī)的思想,狀態(tài)跳轉(zhuǎn)關(guān)系如圖3所示。IOMMU收到地址轉(zhuǎn)換請求后,首先會向緩存查詢是否存在所需的DC,若命中,則直接取回使用;若未命中,則開始3級查表的流程。每次讀取內(nèi)存信息后,IOMMU將對其內(nèi)容進(jìn)行合法性檢查,非法則跳轉(zhuǎn)FAULT狀態(tài),記錄并上報錯誤信息。
DC中與MSI相關(guān)的參數(shù)主要包括MSI地址掩碼(address mask) 、地址模式(address pattern) 和MSI頁表指針(msiptp) 。地址掩碼和地址模式一起用于識別請求是否為MSI 類型,并輔助索引MSI 頁表項(PTE) 。MSI頁表指針用于找到控制MSI地址轉(zhuǎn)換為頁表的入口物理地址。
當(dāng)MSI 地址A 滿足如下關(guān)系:(A >> 12) &~msi_addr_mask = (msi_addr_pattern & ~msi_addr_mask)時,則IOMMU確認(rèn)進(jìn)行MSI重定向。IOMMU首先查詢IOATC中是否存在目標(biāo)MSIPTE,若命中則直接取回PTE,否則需要訪問內(nèi)存獲得。訪存前,IOMMU從地址A中提取一個中斷文件編號I,I = ex?tract(A >> 12, msi_addr_mask)。extract函數(shù)示例如下:若x = a b c d e f g h,y = 1 0 1 0 0 1 1 0,則extract(x,y) = 0 0 0 0 a c f g。使用msiptp的PPN字段作為基地址,(I << 4) 作為偏移量,組合得到PTE的訪存地址。每個PTE占據(jù)16字節(jié),IOMMU將驗證MSIPTE的合法性,如果合法,則根據(jù)MSIPTE的內(nèi)容執(zhí)行地址轉(zhuǎn)換,否則電路狀態(tài)會跳轉(zhuǎn)至FAULT狀態(tài),將錯誤信息發(fā)送至錯誤隊列中。當(dāng)MSIPTE處于基本翻譯模式時,假設(shè)轉(zhuǎn)換前的地址為A,則轉(zhuǎn)換后得到的地址為(MSIPTE.PPN << 12) | A[11:0]。訪問MSI頁表項的狀態(tài)機(jī)設(shè)計如圖4所示。
2.2 IMSIC 的設(shè)計
IMSIC由多個中斷文件組成,其中客戶中斷文件負(fù)責(zé)處理虛擬MSI中斷。IMSIC中斷文件的硬件設(shè)計結(jié)構(gòu)框架如圖5所示。在本設(shè)計中,每個客戶中斷文件支持的中斷數(shù)量為127。IOMMU將以GPA編程的MSI重定向到中斷文件的接收區(qū)域(receive region) 的內(nèi)存映射寄存器中。接收區(qū)域硬件將不同形式的中斷轉(zhuǎn)換為統(tǒng)一的脈沖信號,并將中斷信息存儲到外部中斷掛起寄存器組(eip array) 中。中斷處理模塊(inter?rupt handle) 管理中斷的處理流程的邏輯,包括APB總線接口的控制、中斷仲裁和中斷流程的交互等。寄存器模塊(regs) 維護(hù)中斷文件的寄存器,這些寄存器保存了中斷的配置信息。
對于CSR間接訪問的實現(xiàn),本設(shè)計采用APB總線協(xié)議,實現(xiàn)hart與中斷文件之間的數(shù)據(jù)交互。在vsise?lect 中設(shè)置中斷文件內(nèi)部寄存器的編號(0x70–0xFF) ,hart訪問vsireg就可以對編號對應(yīng)的中斷文件寄存器訪問。具體地,vsiselect寄存器的值連接到總線的地址線,而vsireg的值連接到總線的數(shù)據(jù)線。同時,信號VGEIN用于指示數(shù)據(jù)的分配情況。
接收區(qū)域發(fā)出的中斷標(biāo)識由中斷處理模塊進(jìn)行譯碼,然后傳送到eip寄存器陣列。中斷寄存器的配置信息與中斷處理模塊相連。當(dāng)多個中斷同時掛起且使能,需要向CPU發(fā)送中斷信息時,IMSIC需要仲裁以確定優(yōu)先級最高的中斷。在IMSIC中,中斷優(yōu)先級數(shù)值與中斷標(biāo)識保持一致,并且中斷標(biāo)識越小,中斷優(yōu)先級越高。由于中斷標(biāo)識號由軟件分配,軟件可以通過配置標(biāo)識符來控制中斷優(yōu)先級。固定的中斷優(yōu)先級減少了優(yōu)先級仲裁電路的硬件成本。
vstopei寄存器是在處理器內(nèi)部實現(xiàn)的一個CSR 寄存器。Hart使用CSR指令來訪問vstopei,相比通過系統(tǒng)總線訪問內(nèi)存映射寄存器的方案,可以加快中斷響應(yīng)速度。當(dāng)Hart接收到中斷信號后,會主動讀取vstopei以獲取外部中斷標(biāo)識,同時向vstopei寫入任意值(寫入值被忽略),以指示客戶中斷文件清除中斷的掛起位。清零中斷掛起位的信息通過APB總線傳遞,APB地址線的最高位作為訪問操作的標(biāo)志位。最高位為1表示清零掛起,數(shù)據(jù)線傳輸清零的中斷標(biāo)識。經(jīng)過中斷文件的譯碼后,APB的信息將用于清零寄存器組中的中斷掛起位。掛起位的清除意味著CPU已經(jīng)處理了對應(yīng)的中斷標(biāo)識。在這個過程中,CPU需要對vstopei執(zhí)行原子讀寫操作,以避免因延遲問題導(dǎo)致中斷信息丟失。
3 仿真結(jié)果與分析
本文采用VCS和Verdi仿真軟件進(jìn)行仿真驗證。對IOMMU部件的功能測試點包括緩存命中和未命中時的行為邏輯,驗證地址轉(zhuǎn)換結(jié)果的準(zhǔn)確性。針對IMSIC部件,主要進(jìn)行中斷控制邏輯的測試,包括中斷的掛起、仲裁、發(fā)送以及中斷完成等功能的正確性。
3.1 MSI 地址轉(zhuǎn)換仿真
對IOMMU進(jìn)行MSI地址轉(zhuǎn)換的應(yīng)用場景的仿真結(jié)果如下。圖6是IOMMU對MSI重映射時,緩存命中的仿真結(jié)果。
信號msi_trans_en_i 在第一個時鐘上升沿被拉高,待轉(zhuǎn)換的地址msi_gpa_i輸入,此時電路的狀態(tài)從IDLE跳轉(zhuǎn)到MSIC_LKUP,同時向MSI緩存請求對應(yīng)的緩存項。第二個時鐘周期等待緩存回應(yīng)。第三個時鐘上升沿,緩存指示命中,并將緩存項交付給TCU,電路狀態(tài)變?yōu)?MSIPTE_RDY。在該狀態(tài)下,轉(zhuǎn)換結(jié)果地址由組合邏輯輸出。MSI地址為0xaa_bbbb_cccc_d123,MSIPTE的44位PPN字段為0xddd_eeee_ffff,轉(zhuǎn)換結(jié)果應(yīng)為0xdd_deee_efff_f123,輸出結(jié)果和電路行為符合預(yù)期。
圖7是IOMMU對MSI重映射時,緩存未命中的仿真結(jié)果。
IOMMU收到MSI重映射請求,TCU查詢緩存,緩存返回未命中信號。當(dāng)電路狀態(tài)跳轉(zhuǎn)到MSI_ACC(編碼為3) ,訪存查詢msi請求信號msi_rqst_vld_o拉高,并將訪存地址交給總線控制單元,指示訪問內(nèi)存。從圖7可以看到信號msi_resp_vld_i有兩次變?yōu)楦唠娖剑@是因為MSIPTE是128位,需要進(jìn)行兩次64位的數(shù)據(jù)傳輸。在第二次傳輸時,msi_resp_last_i將會拉高,說明已經(jīng)接收到完整的PTE。此時電路狀態(tài)跳轉(zhuǎn)到MSI_CHECK(編碼為4) ,IOMMU會對PTE的合法性進(jìn)行檢查。檢查通過則把訪存得到的PTE填充到緩存中,并且電路跳轉(zhuǎn)到MSIPTE_RDY(編碼為2) 。轉(zhuǎn)換結(jié)果地址在該狀態(tài)輸出,輸出地址與預(yù)期一致,電路功能設(shè)計正確。生成訪存地址時,設(shè)計使用extract 函數(shù)提取中斷文件編號。如圖7所示,輸入的gpa為0xaa_bbbb_cccc_d123,msi 掩碼為1011_1110_0000_1001,電路計算得到的中斷文件編號為0x9b。extract 的硬件功能設(shè)計正確。
3.2 中斷控制邏輯仿真
對IMSIC 中斷控制的場景的仿真結(jié)果如圖8所示。
當(dāng)VGEIN信號值為1時,Hart將與編號為1的VS 中斷文件進(jìn)行交互。一旦接收區(qū)域識別到MSI,將發(fā)出中斷標(biāo)識號的脈沖信號。IMSIC將在下一個時鐘周期內(nèi)將中斷信息保存在EIP寄存器中。在本次仿真中,EITHRESHOLD 寄存器的值配置為7,EIDELIVERY寄存器的使能位已激活,EIE寄存器的值配置為0xff8,以使能除1號和2號之外的所有中斷源。IOMMU按順序向IMSIC發(fā)送從8號中斷到1號中斷,當(dāng)EIP的值為0xfc時,仿真結(jié)果顯示輸出最高優(yōu)先級的3號中斷,證明優(yōu)先級仲裁功能正確。當(dāng)IMSIC 繼續(xù)接收2號和1號中斷時,由于EIE的使能控制,即使它們的優(yōu)先級更高,仍然輸出3號中斷。Hart在接收中斷后,指示IMSIC清除相應(yīng)的中斷掛起位。如圖8所示,當(dāng)清除標(biāo)志信號拉高時,對應(yīng)的掛起位將被清除,并在之后輸出次高優(yōu)先級的中斷。隨著Hart處理完所有掛起的中斷,中斷通知信號IRQ和IRQ_ID都跳變?yōu)?。仿真的結(jié)果與協(xié)議中描述的邏輯一致,電路邏輯設(shè)計正確。
3.3 仿真結(jié)果分析
觀察仿真波形,結(jié)合AIA 協(xié)議中對IMSIC 和IOMMU功能的描述可知,各個模塊工作正常,邏輯功能正確。在本文設(shè)計中,IMSIC實現(xiàn)了直接接收和處理MSI,較PLIC結(jié)構(gòu)更加簡化,并設(shè)置了專用的交互通道,與CPU的交互速度更快,通常僅需3到4個時鐘周期完成一次交互。此外,設(shè)計中將中斷標(biāo)識直接連接到CPU,避免了在SOC系統(tǒng)總線上查詢中斷標(biāo)識的需求,加快了中斷處理流程。采用軟件方式實現(xiàn)的MSI中斷虛擬化需要頻繁進(jìn)行VMM和guest OS的上下文切換,通常需要大量的CPU指令完成,是一種非常耗時的過程。這種上下文切換通常需要耗費數(shù)千個時鐘周期[8],而某國產(chǎn)處理器的延遲也在微秒級別。借助硬件輔助的IOMMU,在DC緩存和MSI緩存命中的情況下,僅需6個時鐘周期即可將MSI重映射到真實的IMSIC中斷文件,從而顯著提升直通設(shè)備的MSI 中斷虛擬化性能。
4 結(jié)論
隨著RISC-V架構(gòu)在高性能計算領(lǐng)域的發(fā)展,面對虛擬化場景,傳統(tǒng)的中斷處理方式顯然會對性能產(chǎn)生影響。本文基于RISC-V AIA協(xié)議,完成了IOMMU 和IMSIC的RTL級電路設(shè)計。本論文在RISC-V平臺下首次引入專門的MSI中斷控制器IMSIC,使得處理器可以直接接收和處理MSI,提升了中斷響應(yīng)速度;并且引入IOMMU部件對MSI重映射,實現(xiàn)在硬件層面上輔助MSI虛擬化,相較于軟件方式,大大減少了MSI 虛擬化的處理時間,提升了RISC-V處理器架構(gòu)在虛擬化場景下的中斷處理效率。仿真結(jié)果表明,本設(shè)計符合AIA協(xié)議的相關(guān)功能描述,可作為IP與RISC-V 處理器核進(jìn)行集成使用。