





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