基於ARMv8系統中的虛擬化工具在這些系統中起著特殊作用,它由幾個元件組成。雖然ARMv7具有作為擴展的特殊CPU模式來運作虛擬機器管理器(hypervisor),但在ARMv8中,已成為架構的一部分,並命名為EL2,整合到特權級(privilege-level)系統中,同時,該模式僅解決與CPU訪問系統資源(例如記憶體和周邊)相關的問題。為提高虛擬化環境中設備啟動事務(transaction)的效率,已經為基於ARMv8的系統開發了許多元件,例如新的中斷控制器和IO記憶體管理單元(MMU)。本文將從系統軟體發展的角度介紹這些工具元件。

基於ARMv8的系統中的虛擬化如圖1所示。EL2特權級運作虛擬機器管理器,控制虛擬機器(VM)程式碼的執行,以及它們之間的資源分享;EL1(OS核心、特權程式碼)和EL0(非特權程式碼)級留給VM實例。位址轉換分兩個階段執行(圖2),在第一階段,使用第一級轉換表(TTBR0_EL1/TTBR1_EL1寄存器中保存的指標)從虛擬位址計算所謂的中間物理位址(IPA);在第二階段,使用管理器準備的第二級表計算實際物理位址(指標儲存在VTTBR_EL2寄存器中)。這樣的組織架構可以提供有效的許可權分離和VM與硬體的隔離,例如,它允許擁有具有一個相同VM的許多實例。

20181102TA31P1 圖1 基於ARMv8系統中的虛擬化。(資料來源:Auriga)

兩級轉換

兩級轉換允許VM維護自己的轉換表,同時還允許管理器完全控制最終結果。EL2特權級專門用於執行管理器程式碼,與其他級別有一些差異,因此,它是最小特權級別,其中,可訪問特殊寄存器VTTBR_EL2、VTCR_EL2,以及用於VM管理的一些其他寄存器。

在ARMv8架構的原始版本中,僅為管理器提供了一個轉換表,而為當前VM提供了另一個轉換表。管理器可以訪問多個特殊寄存器,透過這些寄存器可以設置在EL1級VM可見的配置參數,例如CPU識別字(製造商、版本等)和多處理器系統ID。這允許操作者將在同一系統上運作的VM呈現給來自不同版本和製造商不同拓撲的虛擬SMP系統及CPU。

如果在VM中發生需要管理器干預的事件,則其處理按如下流程執行:

˙EL2級發生異常。

˙根據其類型,從表中調用相應的處理常式(位址儲存在VBAR_EL2寄存器中)。

˙執行必要的行動。

˙如果需要,將所需值放入寄存器。

˙管理器返回到退出發生處的VM(如果相應地設計了管理器,則切換到另一個VM)。

20181102TA31P2 圖2 分兩個階段執行的位址轉換。(資料來源:Auriga)

發生此類VM退出異常的事件由HCR_EL2寄存器定義。因此,這些可以是系統寄存器訪問,包括EL1特權級可用的訪問(例如,TTBR0_EL1/TTBR1_EL1、FAR_EL1)、快取記憶體和TLB刷新指令、常規異常(中斷、包括來自計時器和不支援的操作程式碼的中斷),以及中斷和事件等待指令,且兩級位址轉換的啟能也由該寄存器控制。此外,EL2級還有一個允許管理器配置週期性中斷的單獨硬體計時器,中斷通常用於啟動VM切換,與現代OS中切換任務的方式類似。

切換過程還包括保存當前VM背景(context)、載入新VM,以及將控制轉移給它,同時,VM可以以類似於EL0級的非特權程式碼執行系統調用的方式來執行管理器調用。為執行這種調用,VM將參數放在寄存器中並執行「hvc」指令。這導致以標準方式處理的EL2特權級的異常,通常,這發生在調用標準化PSCI協議功能時。

不僅如此,管理器可以攔截從VM到可信任程式碼常式的調用(例如,在那裡實現非虛擬化環境中的PSCI,並且在最高特權級EL3處理對它的調用)。ARMv8架構還包含用於提高虛擬化環境性能的其他工具,除了管理器為減少快取記憶體一致性流量問題分配的可共用域之外,還可為每個VM分配其自己的識別字或VMID。它的使用使得在切換VM時可避免「昂貴的」TLB刷新。

原始版本的ARMv8提供8位元識別字,後來擴展為16位元。此外,在ARMv8.1中,EL2級的第二個轉換表TTBR1_EL2作為VM主機擴展的一部分添加,因此Type 2的管理器(它們是主機OS的一部分)具有更多可能性。同時,如上所述,全功能虛擬化需要VM與周邊(網路介面卡、儲存控制器等)進行互動,同時最小化管理器的參與,以及從周邊到處理器的交付中斷實施。

系統記憶體管理單元

ARMv8系統中虛擬化環境的這些方面由兩個單元處理:通用中斷控制器(GIC)以及,系統記憶體管理單元(SMMU)(圖3)。SMMU執行I/O位址轉換的方式與CPU啟動的記憶體訪問相同,該單元支援I/O位址的一級和兩級轉換,可以在VM和管理器中利用轉換和保護記憶體區域的好處,因此,允許設備僅對特定記憶體位址範圍進行讀/寫。

20181102TA31P3 圖3 系統記憶體管理單元。(資料來源:Auriga)

此外,有時透過SMMU在I/O緩衝區上組織分散-收集(scatter-gather)操作會很方便。轉換階段的使用模型與CPU核心的使用模型幾乎相同(即第一階段的輸出產生當前VM獨有的IPA;第二階段的輸出產生整個系統唯一的真實物理位址)。SMMU轉換表的格式類似於CPU所用的格式,但頁面屬性有差異,取決於寄存器設置、轉換階段,以及完整的48或52位元位址空間,可支援4、16和64KB頁面大小,以及一或兩個轉換表。

每個涉及的設備都有自己的轉換背景(它最終選擇相關的轉換表集)。可在多個設備之間共用單一背景,背景選擇由單元使用所謂的流ID(硬體相關的設備識別字)來執行,因此,對於PCIe設備(物理或虛擬功能),RID用於複製PCIe配置空間中的設備位址識別字。SMMU擁有自己的TLB並支援VM ID以實現加速,在檢測到錯誤配置、轉換錯誤和其他異常情況下,SMMU斷言(assert)所謂的背景中斷(即綁定到轉換背景的中斷)。

SMMU的維護類似於CPU MMU的維護。但處理器MMU上的操作(TLB復位、轉換結果檢索等)是利用特殊指令執行;而對於SMMU,它們是透過訪問背景寄存器執行。截至2017年底,有多個版本的SMMU規範,最新版本為3.1。SMMU版本3.0和3.1支援擴展流ID,並使用RAM中的表來匹配流和背景ID,這樣的表可以有一或兩個級別。表內元素包含:指向也儲存在記憶體中的背景描述符指標、與元素相關的VM識別字,以及指向第二級轉換表的指標。

反過來,背景描述符包含指向第一級轉換表的指標。SMMUv3的一個重要特性是能夠在軟體回應之前停止執行事務,這種模型允許設備訪問不在RAM中的頁面(例如,交換檔/交換分區)或者推測性地進行指配。SMMU還可以自動設置轉換表中的更改(或髒的)頁面指示位元,這可以簡化VM遷移、VM狀態快照等。SMMUv3還支援VM識別字遮罩,允許在不同VM之間共用轉換表,從而降低TLB壓力。

在SMMUv3中,控制和事件訊令都已經過有效的重構:該單元使用事件佇列,它是記憶體中的環形緩衝區;背景中斷被替換為表示佇列中出現新描述符的中斷。其中,有一個單獨佇列,即所謂的頁面請求介面(PRI),可用於獲取設備訪問的頁面。如上所述,使用記憶體中的控制塊,而非背景寄存器,並透過將命令描述符寫入命令佇列並提交它們以實現背景管理。

GIC在虛擬化環境功能中發揮著至關重要的作用。到2017年底,該規範的第四版是最新版,而第二版是用於ARMv8處理器的最小版本。GIC本身是個非常複雜的設備,因為需要在多處理器系統中提供中斷(現有實現可以有256或更多的硬體執行緒),但是,本文僅考慮與虛擬化直接相關的控制器功能。大多數GIC寄存器都沒有虛擬化,這會在訪問時導致VM退出。同時,該規範引入了諸如虛擬中斷之類的概念。

中斷虛擬化

虛擬中斷可分為兩個虛擬組中的一個:組0和組1。組0保存所謂的快速插斷要求(FIQ),而組1保存所有其他插斷要求(IRQ),處理器以與處理物理中斷完全相同的方式處理虛擬中斷。基於ARMv8的虛擬化環境中的中斷處理組織,如來自設備的物理中斷被發送到EL2級(到虛擬管理器),且如果該中斷針對某一事件,則管理器啟動虛擬處理器上的相應虛擬中斷,系統和服務中斷都可以路由到虛擬機器管理器。根據GIC規範,虛擬機器管理器在虛擬化之前處理物理中斷。

GIC中的中斷虛擬化支持由表示虛擬中斷的事件清單為依託,它們儲存在相應寄存器中並作為虛擬IRQ或FIQ處理。透過處理器寄存器介面的虛擬中斷控制類似於物理中斷控制,因此,在虛擬處理器上運作的軟體能夠執行以下操作:

˙設置虛擬優先順序遮罩。

˙控制在組內解釋虛擬優先順序的方式。

˙確認虛擬中斷。

˙降低虛擬中斷優先順序。

˙停用虛擬中斷。

為管理虛擬中斷,CPU介面提供了一組系統寄存器,其位址與物理中斷控制寄存器的位址相同,這意味著控制機制對於VM是絕對透明。虛擬中斷列表上的寄存器數量是由實現決定,但限制為16。如果定址到的虛擬處理器的中斷數超過可用寄存器數,則管理器可將相應事件存入記憶體,待有空閒寄存器時再將其寫入,而中斷優先順序由硬體處理。

虛擬介面產生定址到管理器的中斷,該中斷宣示管理器應做出相應回應的事件(空的中斷列表、啟用和禁用組、發訊令通知不在寄存器中的中斷有中斷結束事件等)的到來。除專用周邊中斷(PPI)和共用周邊中斷(SPI)之外,ARMv8系統還有一整類稱為特定於位置的周邊中斷(LPI)的消息(消息訊令的中斷;MSI)啟發的中斷訊號。

GICv3及更高版本的GIC擴展了對此類中斷的支援,可根據特殊規則(中斷轉換服務;ITS)處理中斷消息。但是,這些功能與虛擬化有某種間接關係,但值得簡要描述它們以提供GICv4中引入變更的一般視圖。

20181102TA31P4 圖4 基於ARMv8系統虛擬化環境中元件與中斷控制器的介面和互動。(資料來源:Auriga)

在使用ITS時,設備透過向目標位址儲存在GITS_TRANSLATOR寄存器中的單元發出寫入事務來發送事件訊號。事務寫入由正在寫入的資料(包含事件ID)和源識別字(與SMMU相同)組成。系統軟體對ITS寄存器進行程式設計,使它們指向設備、集合和記憶體中的中斷記憶體表,這些記憶體表包含處理來自指定目標CPU核心和中斷ID相關源的事件規則。

中斷導致在掛起中斷表中設置元素的相應欄位。對於GICv3,該機制僅針對物理中斷(即由設備直接發訊令通知)進行定義,這導致管理器實現中的某些不便,特別是它要求管理器執行ITS在軟體中完成的所有操作。GICv4導入了以程式設計方式生成此類中斷,並將LPI轉換成為相應虛擬處理器設置的虛擬中斷能力,為此引入了描述中斷與目標處理器親和性(affinity)的附加表,以及虛擬掛起中斷表。如果中斷到達時,映射到目標虛擬CPU的目標物理CPU核心正在執行具有不同識別字的VM,則GICv4會生成一個旨在通知管理器這種情況的特殊中斷。為了控制虛擬中斷的轉換,ITS GICv4命令介面中添加了新的命令類型。

本文中描述的工具代表了虛擬化環境實現的堅實基礎,現在它們得到各種虛擬機器管理器(第一類和第二類)的良好支援。總的來說,因應軟體發展人員的請求,CPU和系統設施架構正在不斷發展之中。

(參考原文: Understanding virtualization facilities in the ARMv8 processor architecture,by Sergey Temerkhanov、Igor Pochinok)