輸入輸出內存管理單元 (IOMMU) 是一個硬件組件,它將支持具有 DMA 功能的 I/O 總線連接到系統內存。 它將設備可見的虛擬地址映射到物理地址,使其在虛擬化中很有用。
在 WDDM 2.0 IoMmu 模型中,每個進程都有一個虛擬地址空間,即:
- 在 CPU 和 GPU 之間共享。
- 由 OS 內存管理器管理。
為了訪問內存,GPU 向兼容的 IOMMU 發送數據請求。 該請求包括一個共享虛擬地址和一個進程地址空間標識符?(PASID)。 IOMMU 使用共享頁表執行地址轉換。 下圖說明了此操作。
內核模式顯示驅動程序 (KMD) 通過設置DXGK_VIDMMCAPS::IoMmuSupported 上限來表示對 IoMmu 模型的支持。 設置此標志后,視頻內存管理器 (VidMm) 會自動將 GPU 與 IOMMU 一起使用的任何進程注冊,并獲取該進程地址空間的 PASID。 PASID 在創建設備期間傳遞給驅動程序。
VidMm 在顯示之前將主要分配映射到光圈段,確保顯示控制器具有對這些分配的物理訪問權限。
在 IoMmu 模型中,用戶模式顯示驅動程序 (UMD) 繼續使用 VidMm 的 Allocate 服務為 GPU 分配視頻內存。 此過程允許 UMD:
遵循駐留模型;
支持 DirectX 資源共享模型;
確保主圖面對內核可見,并在顯示之前映射到內存調整;
UMD 在用戶模式下完全管理第一級轉換(磁貼資源地址到共享 CPU/GPU 地址)。
基于 IOMMU 的 GPU 隔離
基于 IOMMU 的 GPU 隔離是一種通過管理 GPU 訪問系統內存的方式來增強系統安全性和穩定性的技術。 本文介紹了 WDDM 基于 IOMMU 的 GPU 隔離功能(適用于支持 IOMMU 的設備),以及開發人員如何在其圖形驅動程序中實現該功能。
此功能從 Windows 10 版本 1803 (WDDM 2.4) 開始提供。?
基于 IOMMU 的 GPU 隔離允許 Dxgkrnl 利用 IOMMU 硬件對從 GPU 訪問系統內存加以限制。 OS 可以提供邏輯地址,而不是物理地址。 這些邏輯地址可用于限制設備對系統內存的訪問,使其只能訪問允許訪問的內存。 它通過確保 IOMMU 將 PCIe 上的內存訪問轉換為有效和可訪問的物理頁面來實現這一目標。
如果設備訪問的邏輯地址無效,則設備就無法訪問物理內存。 這一限制可防止一系列允許攻擊者通過受損硬件設備訪問物理內存的漏洞。 如果缺少它,攻擊者就可以讀取設備運行所不需要的系統內存內容。
默認情況下,只有為 Microsoft Edge 啟用 Windows Defender 應用程序防護(即容器虛擬化)的電腦才會啟用此功能。
出于開發目的,實際的 IOMMU 重新映射功能是通過以下注冊表鍵值來啟用或禁用的:
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\GraphicsDrivers
DWORD: IOMMUFlags0x01 Enabled* Enables creation of domain and interaction with HAL0x02 EnableMappings* Maps all physical memory to the domain* EnabledMappings is only valid if Enabled is also set. Otherwise no action is performed0x04 EnableAttach* Attaches the domain to the device(s)* EnableAttach is only valid if EnableMappings is also set. Otherwise no action is performed0x08 BypassDriverCap* Allows IOMMU functionality regardless of support in driver caps. If the driver does not indicate support for the IOMMU and this bit is not set, the enabled bits are ignored.0x10 AllowFailure* Ignore failures in IOMMU enablement and allow adapter creation to succeed anyway.* This value cannot override the behavior when created a secure VM, and only applies to forced IOMMU enablement at device startup time using this registry key.
如果啟用此功能,IOMMU 將在適配器啟動后立即啟用。 所有在此之前分配的驅動程序在啟用后都會被映射。
此外,如果將速度暫存密鑰 14688597 設置為已啟用,則會在創建安全虛擬機時激活 IOMMU。 目前,此暫存密鑰默認為已禁用,以便在沒有適當 IOMMU 支持的情況下允許自托管。
在啟用后,如果驅動程序不提供 IOMMU 支持,則啟動安全虛擬機會失敗。
目前還無法在 IOMMU 啟用后將其禁用。
IOMMU DMA 重新映射
直到 WDDM 3.0,Dxgkrnl 僅支持通過 1:1 物理重新映射實現 IOMMU 隔離,這意味著 GPU 訪問的邏輯頁被轉換為相同的物理頁碼。 IOMMU DMA 重新映射允許 GPU 通過不再以 1:1 映射的邏輯地址訪問內存。 相反,Dxgkrnl 能夠提供邏輯上連續的地址范圍。
Dxgkrnl 對 GPU 施加限制:GPU 必須能夠訪問所有物理內存才能啟動設備。 如果 GPU 的最高可見地址不超過系統上安裝的最高物理地址,則 Dxgkrnl 將無法初始化適配器。 即將推出的服務器和高端工作站可以配置超過 1 TB 的內存,突破了許多 GPU 常見的 40 位地址空間限制。 DMA 重新映射用作允許 GPU 在此環境中工作的機制。
在啟動時,Dxgkrnl 通過將設備的最高可訪問物理地址與系統上安裝的內存進行比較來確定是否需要邏輯重新映射。 如有必要,DMA 重新映射用于將 GPU 可見邊界內的邏輯地址范圍映射到系統上的任何物理內存。 例如,如果 GPU 限制為 1 TB,則 Dxgkrnl 將從 [0, 1 TB) 分配邏輯地址,然后可以通過 IOMMU 映射到系統上的任何物理內存。