注冊表設置
GPU虛擬化標志
GpuVirtualizationFlags 注冊表項用于設置半虛擬化 GPU 的行為。 密鑰位于:
DWORD HKLM\System\CurrentControlSet\Control\GraphicsDrivers\GpuVirtualizationFlags
定義了以下位:
位 | 描述 |
0x1 | ? ? |
0x2 | 強制為 BasicRender 設置 ParavirtualizationSupported 上限。 在主機中使用該位。 |
0x4 | 強制安全虛擬機模式,其中所有虛擬機都將被視為安全。 在此模式下,用戶模式驅動程序存在限制。 例如,驅動程序無法使用 Escape 調用,因此它們會失敗。 在主機中使用該位。 |
0x8 | 啟用準虛擬化適配器與僅顯示適配器配對。 在客用虛擬機中使用此比特。 默認情況下啟用配對。 |
GuestIoSpaceSizeInMb
GuestIoSpaceSizeInMb 注冊表項用于設置虛擬 GPU 的來賓 IO 空間的大小(以兆字節為單位)。 默認值為 1,000MB (1GB)。 密鑰位于:
DWORD HKLM\System\CurrentControlSet\Control\GraphicsDrivers\Paravirtualization\GuestIoSpaceSizeInMb
來賓 IO 空間目前實現了 CPU 可見分配。 主機中 CPU 可見的分配后備存儲被固定在內存中,并映射到來賓 IO 空間。 在來賓中,分配的用戶模式虛擬地址被映射到 IO 空間區域。 在某些 Haswell 系統上,CPU 具有 36 位物理地址。 此類系統上的 Hyper-V 具有有限的 IO 空間大小。
為安全虛擬機禁用 IOMMU 隔離
如果驅動程序不支持 IoMmu 隔離,請在開發過程中使用以下注冊表設置來禁用 IoMmu 隔離。
`DWORD HKLM\SYSTEM\CurrentControlSet\Control\GraphicsDrivers\IoMmuFlags = 8`
限制虛擬函數的數量
?默認情況下,支持 GPU 半虛擬化的適配器公開的虛擬函數數為 32。 此數字表示可將適配器添加到 32 個虛擬機,假設每個 VM 都有一個適配器。
可以使用以下注冊表設置來限制公開的虛擬函數數。
DWORD HKLM\SYSTEM\CurrentControlSet\Control\GraphicsDrivers\NumVirtualFunctions
例如,如果將?NumVirtualFunctions
?設置為 1,則適配器一次只能添加到一個 GPU。 如果計算機有多個支持 GPU-PV 的 GPU 適配器,并且想要將每個適配器分配給 VM,則此設置非常有用。?Add-VMGpuPartitionAdapter
?不允許指定要添加的適配器。 因此,如果將兩個適配器添加到 VM,兩個適配器都可以從主機獲取相同的 GPU-PV 適配器。
WDDM 2.4 DDI 更新
以下 DDI 更新用于支持 WDDM 2.4 中的 GPU 半虛擬化。
已添加 DXGK_VIDMMCAPS 上限
ParavirtualizationSupported 功能已被添加到 DXGK_VIDMMCAPS 結構體中。 如果主機 KMD 實現本部分中所述的所有 DDI,則設置此上限。
通過 DDI 傳遞的驅動程序專用數據
UMD 使用各種 DDI 與相應的 KMD 交換專用信息。 當 UMD 在來賓 VM 中運行時,相應的 KMD DDI 調用在主機分區中發生。 因此,UMD:
- 無法在私有數據中傳遞任何指針。
- 無法在私有數據中傳遞任何句柄。
- 不應指示 KMD 對 GPU 狀態進行全局更改,因為此更改可能會影響其他正在運行的 VM。
為 DxgkDdiCreateProcess 添加了 VirtualMachineProcess 標志
OS 為每個正在運行的 VM 創建 VM 工作進程。 Dxgkrnl 創建相應的 DXGPROCESS,并在設置 VirtualMachineWorkerProcess 標志后調用 DxgkDdiCreateProcess。 在此進程上下文中不會創建渲染或驅動程序資源。 因此,驅動程序可能會跳過分配某些資源。
OS 在主機中為使用 GPU 的來賓 VM 中的每個進程創建 DXGPROCESS。 Dxgkrnl 調用 DxgkDdiCreateProcess 并設置了 VirtualMachineProcess 標志。 每個 VM DXG 進程都屬于與 VM 工作進程相同的 EPROCESS。?