瞭解一下ARMv8處理器架構中的虛擬化操作 | 半導體行業觀察
來源:內容由 微信公眾號 半導體行業觀察(ID:icbank)翻譯自「embedded」,作者 Sergey Temerkhanov&Igor Pochinok,謝謝。
基於ARMv8的系統中的虛擬化工具在這些系統中起著特殊的作用,它由幾個元件組成,雖然ARMv7具有特殊的CPU模式來執行虛擬機器管理程式作為擴充套件,但在ARMv8中,它已成為架構的一部分,並且已經以名稱EL2整合到特權級系統中。同時,該模式僅解決與CPU訪問系統資源相關的問題,例如儲存器和外圍裝置。為了提高虛擬化環境中裝置啟動的事務的效率,已經為基於ARMv8的系統開發了許多元件,例如新的中斷控制器和IOMMU。本文從軟體開發的角度概述了這些工具元件。
基於ARMv8的系統中的虛擬化如圖1所示:EL2特權級別執行虛擬機器管理程式,控制虛擬機器(VM)程式碼的執行以及它們之間的資源共享。EL1(OS核心,特權程式碼)和EL0(非特權程式碼)的級別留給VM例項。地址轉換分兩個階段執行(圖2):在第一階段,使用第一級轉換表(TTBR0_EL1 / TTBR1_EL1暫存器中儲存的指標)從虛擬地址計算所謂的中間實體地址(IPA); 在第二階段,使用管理程式準備的第二級表計算實際實體地址(指標儲存在VTTBR_EL2暫存器中)。這樣的組織架構可以提供有效的許可權分離和VM與硬體的隔離。

兩級轉換
兩級轉換允許VM維護自己的轉換表,同時還允許管理程式完全控制最終結果。EL2許可權級別專門用於執行管理程式程式碼,與其他級別有一些差異。因此,它是特殊暫存器VTTBR_EL2、VTCR_EL2可訪問的最小特權級別以及用於VM管理的許多其他特權暫存器。
在ARMv8架構的原始版本中,僅為管理程式提供了一個轉換表,而為當前VM提供了另一個轉換表。管理程式可以訪問多個特殊暫存器,通過這些暫存器可以設定EL1級別的VM可見的配置引數,例如CPU識別符號(製造商,版本等)和多處理器系統ID。這允許將在同一系統上執行的VM暴露給來自不同版本和製造商的虛擬SMP系統和CPU的不同拓撲。
- 如果在VM中發生需要管理程式干預的事件,則其處理按如下方式執行:
- 在EL2級別發生異常;
- 根據其型別,從表中呼叫相應的處理程式(該地址儲存在VBAR_EL2暫存器中);
- 執行必要的行動;
- 如果需要,將所需值放入登記冊;
- 管理程式返回到退出發生的VM(如果設計了管理程式,則切換到另一個VM)。

發生此類VM退出異常的事件由HCR_EL2暫存器位定義。因此,這些可以是系統暫存器訪問,包括EL1許可權級別可用的訪問(例如,TTBR0_ EL1 / TTBR1_EL1,FAR_EL1),快取和TLB重新整理指令,常規異常(中斷,包括來自定時器和不支援的操作程式碼的中斷),以及中斷和事件等待指令。兩級地址轉換啟用也由該暫存器控制。此外,EL2級還有一個單獨的硬體定時器,它允許管理程式配置週期性中斷,通常用於啟動VM切換,類似於在現代作業系統中切換任務的方式。
切換過程還包括儲存當前VM上下文,載入新VM以及將控制轉移給它。同時,VM可以以類似於EL0級別的非特權程式碼執行系統呼叫的方式執行管理程式呼叫。為了執行這樣的呼叫,VM將引數放在暫存器中並執行“hvc”指令。這導致以標準方式處理的EL2許可權級別的異常。通常,這在呼叫標準化PSCI協議功能時發生。
還應該提到的是,管理程式可以攔截從VM到可信程式碼例程的呼叫(例如,在那裡實現非虛擬化環境中的PSCI,並且在最高特權級別EL3處理對它的呼叫)。ARMv8架構還包含用於提高虛擬化環境效能的其他工具:除了管理程式可以分配的可共享域以減少快取一致性流量之外,還可以為每個VM分配其自己的識別符號或VMID。它的使用使得在切換VM時可以避免“昂貴的”TLB重新整理。
原始版本的ARMv8提供了8位識別符號,後來擴充套件為16位。此外,在ARMv8.1中,EL2級別的第二個轉換表TTBR1_EL2作為VM主機擴充套件的一部分新增,因此,型別2的管理程式(它們是主機作業系統的一部分)具有更多可能性。同時,如上所述,全功能虛擬化需要VM與外圍裝置(網路介面卡,儲存控制器等)進行互動,同時最小化管理程式參與以及從裝置到處理器的交付中斷。
系統儲存管理單元
ARMv8系統中虛擬化環境的各個方面由兩個單元處理:通用中斷控制器(GIC)和系統記憶體管理單元(SMMU)(圖3)。SMMU執行I / O地址轉換的方式與CPU啟動的儲存訪問相同。該單元支援I / O地址的一級和兩級轉換。因此,可以在VM和管理程式中使用轉換和保護記憶體區域的優勢。因此,允許裝置僅對特定儲存器地址範圍進行讀/寫。

此外,有時通過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處理器的最小版本。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中引入的更改的一般檢視。

在使用ITS時,裝置通過在GITS_TRANSLATOR暫存器中發出具有目標地址的寫事務來發送事件訊號。寫入事務由正在寫入的資料(包含事件ID)和源識別符號(與SMMU相同)組成。系統軟體對ITS暫存器進行程式設計,使它們指向儲存器中的裝置、集合和中斷儲存器表,這些儲存器表包含處理來自指定目標CPU核心和中斷ID的相關源的事件的規則。
中斷導致在掛起中斷表中設定元素的相應欄位。對於GICv3,此機制僅針對物理中斷(即,由裝置直接發訊號通知)進行定義。這導致管理程式實現中的某些不便。特別是,它要求管理程式執行ITS在軟體中完成的所有操作。GICv4引入了以程式設計方式生成此類中斷並將LPI轉換為為相應虛擬處理器設定的虛擬中斷的功能,為此引入了描述中斷與目標處理器的親和性的附加表,以及虛擬掛起中斷表。如果在中斷到達期間對映到目標vCPU的目標物理CPU核上正在執行具有不同識別符號的VM,GICv4生成一個特殊的中斷,旨在通知管理程式。為了控制虛擬中斷的轉換,ITS GICv4命令介面中添加了新的命令型別。
本文描述的工具為虛擬化環境的實現提供了堅實基礎,現在,它們得到了各種虛擬機器管理程式(第一類和第二類)的良好支援。總的來說,基於軟體開發人員的請求,CPU和系統設施架構正在不斷髮展。