s390 (IBM Z) Ultravisor 和受保護的虛擬機器¶
摘要¶
受保護虛擬機器 (PVM) 是 KVM 虛擬機器,它不允許 KVM 訪問虛擬機器狀態,如客戶機記憶體或客戶機暫存器。相反,PVM 主要由一個名為 Ultravisor (UV) 的新實體管理。UV 提供了一個 API,PVM 和 KVM 可以使用它來請求管理操作。
每個客戶機以非保護模式啟動,然後可能請求轉換為保護模式。在轉換時,KVM 會將客戶機及其 VCPU 註冊到 Ultravisor,併為執行它做好一切準備。
Ultravisor 將保護和解密客戶機的引導記憶體(即核心/initrd)。它將在客戶機執行時保護狀態更改,如 VCPU 啟動/停止和注入中斷。
由於通常需要訪問客戶機的狀態(例如 SIE 狀態描述)才能執行虛擬機器,因此 SIE 指令的行為發生了一些變化。引入了一種新的格式 4 狀態描述,其中一些欄位對於 PVM 具有不同的含義。SIE 出口被儘可能地最小化,以提高速度並減少暴露的客戶機狀態。
中斷注入¶
中斷注入由 Ultravisor 保護。由於 KVM 無法訪問 VCPU 的低核(lowcores),注入透過格式 4 狀態描述處理。
機器檢查、外部、I/O 和重新啟動中斷均可在 SIE 進入時透過中斷注入控制欄位(偏移量 0x54)中的位注入。如果在注入時客戶機 CPU 未啟用中斷,則會識別出有效性攔截。格式 4 狀態描述在攔截資料塊中包含欄位,其中可以傳輸與中斷相關的資料。
程式和服務呼叫異常有另一層保護;它們只能針對已被攔截到 KVM 中的指令進行注入。這些異常需要是 KVM 指令模擬的有效結果,例如,我們絕不能注入定址異常,因為它們由 SIE 報告,因為 KVM 無法訪問客戶機記憶體。
掩碼通知攔截¶
KVM 無法再攔截 lctl(g) 和 lpsw(e),以便在 PVM 啟用特定類中斷時收到通知。作為替代,引入了兩個新的攔截碼:一個表示 CRs 0、6 或 14 的內容已更改,指示不同的中斷子類;另一個表示 PSW 位 13 已更改,指示已請求機器檢查干預且現已啟用。
指令模擬¶
對於 PVM 的格式 4 狀態描述,SIE 指令已經比格式 2 解釋了更多的指令。它無法解釋所有指令,但需要將一些任務交給 KVM;因此,SIE 和 ultravisor 保護模擬輸入和輸出。
與 SIE 相關的控制結構提供了安全指令資料區 (SIDA)、攔截引數 (IP) 和安全攔截通用暫存器儲存區。客戶機 GR 和大部分指令資料(例如 I/O 資料結構)都經過過濾。指令資料在需要時複製到 SIDA 和從 SIDA 複製。客戶機 GR 被放入/從安全攔截通用暫存器儲存區檢索。
只有模擬指令所需的 GR 值才會被複制到此儲存區,並且真實的暫存器編號將被隱藏。
攔截引數狀態描述欄位仍然包含指令文字的位元組,但是是預設的暫存器值而不是實際值。也就是說,每條指令總是使用相同的指令文字,以避免洩露客戶機指令文字。這還意味著從虛擬機器監控程式的角度來看,客戶機在 r<n> 中擁有的暫存器內容可能在 r<m> 中。
安全指令資料區包含指令儲存資料。指令資料,即由指令引用(例如 sclp 的 SCCB)的資料,透過 SIDA 移動。當指令被攔截時,SIE 將只允許該指令的資料和程式中斷透過前面討論的兩個資料區移動到客戶機。其他資料要麼被忽略,要麼導致有效性攔截。
指令模擬攔截¶
SIE 安全指令攔截有兩種型別:普通型別和通知型別。普通安全指令攔截將使客戶機等待被攔截指令型別的指令完成,即在 SIE 進入時,嘗試使用 KVM 提供的資料完成指令的模擬。這可能是程式異常或指令完成。
通知型別攔截將客戶機指令解釋導致的客戶機環境變化通知給 KVM。例如,store prefix 指令會識別出此類攔截,以提供新的低核位置。在 SIE 重新進入時,資料區中的任何 KVM 資料都會被忽略,並且執行繼續,如同客戶機指令已完成一樣。因此,KVM 不允許注入程式中斷。