ARMv8處理器體系結構中的虛擬化功能
時間:2020-05-07 來源:原創
基于ARMv8的系統中的虛擬化設施在這些系統中扮演著特殊角色,并且由幾個組件組成。盡管ARMv7具有特殊的CPU模式來運行虛擬機監控程序作為擴展,但在ARMv8中,它已成為體系結構的一部分,并且已以EL2的名稱集成到特權級系統中。同時,此模式僅解決與CPU訪問內存和外圍設備等系統資源相關的問題。為了提高虛擬環境中設備啟動的事務處理效率,已經為基于ARMv8的系統開發了許多組件,例如新的中斷控制器和IOMMU。本文從系統軟件開發的角度概述了這些功能。
基于ARMv8的系統中的虛擬化的組織如圖1所示:EL2特權級別運行虛擬機監控程序,以控制虛擬機(VM)代碼的執行以及虛擬機之間的資源共享。VM實例保留EL1(操作系統內核,特權代碼)和EL0(非特權代碼)級別。地址轉換分為兩個階段(圖2):在第一階段,使用第一級轉換表(保存在TTBR0_EL1 / TTBR1_EL1寄存器中的指針)從虛擬地址計算出所謂的中間物理地址(IPA);在第二階段,使用管理程序準備的第二級表計算實際物理地址(指針存儲在VTTBR_EL2寄存器中)。這樣的組織提供了有效的特權分離,并將VM與硬件隔離。例如,這允許

圖1.基于ARMv8的系統中的虛擬化
兩級翻譯
兩級轉換允許VM維護自己的轉換表,同時還允許虛擬機監控程序完全控制最終結果。EL2特權級別專門設計用于執行管理程序代碼,并且與其他級別有所不同。因此,這是最低特權級別,可以訪問特殊寄存器VTTBR_EL2,VTCR_EL2以及許多其他打算用于VM管理的特權。
在ARMv8架構的原始版本中,僅為管理程序提供了一個轉換表,為當前VM提供了另一個轉換表。系統管理程序可以訪問幾個特殊寄存器,通過這些寄存器可以設置EL1級別的VM可見的配置參數,例如CPU標識符(制造商,版本等)和多處理器系統ID。這樣一來,就可以將運行在同一系統上的VM暴露給不同版本和制造商的虛擬SMP系統和CPU的不同拓撲。
如果VM中發生需要管理程序干預的事件,則其處理如下:
EL2級別發生異常;
根據其類型,從表中調用適當的處理程序(地址存儲在VBAR_EL2寄存器中);
執行必要的動作;
如果需要,將所需的值放入寄存器中;
虛擬機管理程序將返回到發生退出的虛擬機(如果虛擬機管理程序進行了相應的設計,則會切換到另一個虛擬機)。

圖2.地址轉換分為兩個階段
通過HCR_EL2寄存器位定義發生此類VM退出異常的事件。因此,這些可以是系統寄存器訪問,包括在EL1特權級別可用的訪問(例如TTBR0_ EL1 / TTBR1_EL1,FAR_EL1),高速緩存和TLB刷新指令,常規異常(中斷,包括來自計時器和不受支持的操作代碼的中斷),以及中斷和事件等待指令。兩級地址轉換使能也由該寄存器控制。此外,在EL2級別上有一個單獨的硬件計時器,它允許虛擬機管理程序配置一個周期性中斷,通常用于啟動VM切換,類似于現代OS中切換任務的方式。
切換過程還包括保存當前VM上下文,加載新VM以及將控制權轉移給它。同時,VM可以類似于EL0級別的非特權代碼執行系統調用的方式來執行虛擬機管理程序調用。為了執行這樣的調用,VM將參數放置在寄存器中并執行“ hvc”指令。這會導致以標準方式處理的EL2特權級別的異常。通常,這在調用標準化PSCI協議功能時發生。
還應該提到的是,管理程序可以攔截從VM到受信任代碼例程的調用(例如,在此處實施非虛擬化環境中的PSCI,并以最高特權級別EL3處理對它的調用)。ARMv8體系結構還包含其他功能,可以提高虛擬化環境的性能:除了虛擬機管理程序可以分配的共享域以減少緩存一致性流量之外,還可以為每個VM分配自己的標識符或VMID。它的使用可以避免在切換虛擬機時“昂貴”的TLB刷新。
ARMv8的原始版本提供了8位標識符,后來又擴展為16位。另外,在ARMv8.1中,作為VM主機擴展的一部分,添加了EL2級別的第二個轉換表TTBR1_EL2,以便Type 2的虛擬機管理程序(屬于主機OS)具有更多的可能性。同時,如上所述,功能齊全的虛擬化要求VM與虛擬機與外圍設備(網絡適配器,存儲控制器等)進行交互,而虛擬機管理程序的參與最少,并且從設備到處理器的傳送中斷。
系統內存管理單元
ARMv8系統中虛擬化環境的這些方面由兩個單元處理:通用中斷控制器(GIC)和系統內存管理單元(SMMU)(圖3)。SMMU以與CPU啟動的內存訪問相同的方式執行I / O地址的轉換。該單元支持I / O地址的一階段和兩階段轉換。因此,轉換和保護內存區域的好處可用于VM以及虛擬機管理程序中。因此,允許設備僅對特定的存儲器地址范圍進行讀/寫操作。

圖3.系統內存管理單元(SMMU)
此外,有時通過SMMU在I / O緩沖區上組織分散收集操作很方便。轉換階段的用法模型與CPU內核的用法模型幾乎相同(即,第一階段的輸出產生當前VM唯一的IPA,第二階段的輸出產生整個主機唯一的實際物理地址。系統)。SMMU轉換表的格式類似于CPU的格式,但頁面屬性有所不同。支持4、16和64 KB的頁面大小,以及一個或兩個轉換表,具體取決于寄存器設置和轉換階段以及完整的48位或52位地址空間。
每個涉及的設備都有其自己的翻譯上下文(最終選擇關聯的翻譯表集)。可以在多個設備之間共享單個上下文。單元使用所謂的流ID(取決于硬件的設備標識符)執行上下文選擇。因此,對于PCIe設備(物理或虛擬功能),RID用作在PCIe配置空間中復制設備地址的標識符。SMMU具有自己的TLB,并支持VM ID進行加速。在錯誤的配置檢測,轉換錯誤和其他異常的情況下,SMMU會聲明所謂的上下文中斷(即,綁定到轉換上下文的中斷)。
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處理器的最小版本。由于必須在多處理器系統中傳遞中斷(現有的實現可以具有256個或更多的硬件線程),因此GIC本身是相當復雜的設備。但是,本文僅考慮與虛擬化直接相關的那些控制器功能。大多數GIC寄存器未虛擬化,這導致在訪問VM時退出。同時,該規范引入了諸如虛擬中斷之類的概念。
中斷虛擬化
虛擬中斷可以分為兩個虛擬組之一:0和1。組0保留所謂的快速中斷請求(FIQ),而組1保留所有其他中斷(中斷請求,IRQ)。虛擬中斷由處理器以與物理中斷完全相同的方式處理。基于ARMv8的虛擬化環境中的中斷處理的組織方式如下:將設備的物理中斷發送到EL2級別(發送至管理程序),如果該中斷旨在用于虛擬機,則管理程序會激活虛擬處理器上的相應虛擬中斷。它。系統中斷和服務中斷都可以路由到管理程序。系統管理程序根據GIC規范在對物理中斷進行虛擬化之前對其進行處理。
GIC對中斷虛擬化的支持由代表虛擬中斷的事件列表支持,這些事件列表存儲在相應的寄存器中,并作為虛擬IRQ或FIQ處理。通過處理器寄存器接口對虛擬中斷的控制類似于對物理中斷的控制。因此,在虛擬處理器上運行的軟件能夠執行以下操作:
設置虛擬優先級掩碼,
控制在組內解釋虛擬優先級的方式,
確認虛擬中斷,
降低虛擬中斷的優先級,并且
停用虛擬中斷。
為了管理虛擬中斷,CPU接口提供了一組系統寄存器,它們與物理中斷控制寄存器位于相同的地址。這意味著控制機制對于VM絕對是透明的。虛擬中斷列表上的寄存器數量是實現定義的,但限制為16個。如果尋址到虛擬處理器的中斷數量超出了可用寄存器的數量,則虛擬機管理程序可以將相應的事件存儲在內存中,以將其寫入釋放的事件中。稍后注冊。中斷的優先級在硬件中執行。
虛擬接口生成尋址到虛擬機管理程序的中斷,該信號通知虛擬機管理程序應相應響應的事件(空中斷列表,啟用和禁用組,針對不在寄存器中的中斷的中斷結束等)。除了專用外圍設備中斷(PPI)和共享外圍設備中斷(SPI),ARMv8系統還具有一類通過消息(消息信號中斷(MSI))發出信號的中斷,稱為局部特定外圍設備中斷(LPI)。
GICv3和更高版本的GIC對此擴展類提供了擴展的支持,可以根據特殊規則(中斷轉換服務(ITS))處理中斷消息。但是,這些功能在某種程度上與虛擬化有間接關系,但是有必要對其進行簡要描述以提供對GICv4中引入的更改的總體了解。

圖4.在基于ARMv8的系統中的虛擬化環境中,組件與中斷控制器的接口和交互
在使用ITS時,設備通過使用GITS_TRANSLATOR寄存器中的目標地址發出寫事務來發出事件信號。寫事務由正在寫入的數據(包含事件ID)和源標識符組成,該數據與SMMU相同。系統軟件對ITS寄存器進行編程,以便它們指向內存中的設備,集合和中斷存儲器表,這些表包含處理來自相關源的事件的規則,這些事件指定了目標CPU內核和那里的中斷ID。
中斷導致未決中斷表中元素的相應字段設置。對于GICv3,此機制僅針對物理中斷(即,由設備直接發出信號的中斷)定義。這導致在管理程序實施中的某些不便。特別是,它要求管理程序在軟件中執行由ITS執行的所有操作。GICv4引入了以編程方式生成此類中斷并將LPI轉換為針對相應虛擬處理器設置的虛擬中斷的功能,為此引入了描述中斷與目標處理器的親和力的其他表以及虛擬掛起的中斷表。如果在中斷到達期間正在映射到目標vCPU的目標物理CPU內核上執行具有不同標識符的VM,GICv4生成一個特殊的中斷,該中斷旨在通知系統管理程序。為了控制虛擬中斷的轉換,已將新的命令類型添加到ITS GICv4命令界面。
本文中描述的功能為虛擬化環境的實現奠定了堅實的基礎,現在,各種虛擬機管理程序(第一和第二種)都很好地支持了這些功能。總體而言,根據軟件開發人員的要求,CPU和系統設施體系結構都在不斷開發中。因此,它將繼續為有關該主題的新文章提供信息。

