16. x86 IOMMU 支援

架構規範可以從以下位置獲取。

本指南提供了一個快速備忘單,用於一些基本理解。

16.1. 基本內容

ACPI 列舉並列出平臺上的不同 IOMMU,以及裝置範圍關係,即裝置由哪個 IOMMU 控制。

一些 ACPI 關鍵字

  • DMAR - Intel DMA 重對映表

  • DRHD - Intel DMA 重對映硬體單元定義

  • RMRR - Intel 保留記憶體區域報告結構

  • IVRS - AMD I/O 虛擬化報告結構

  • IVDB - AMD I/O 虛擬化定義塊

  • IVHD - AMD I/O 虛擬化硬體定義

16.1.1. 什麼是 Intel RMRR?

有些裝置由 BIOS 控制,例如,USB 裝置執行 PS2 模擬。用於這些裝置的記憶體區域在 e820 對映中標記為保留。當我們開啟 DMA 轉換時,對這些區域的 DMA 將會失敗。因此,BIOS 使用 RMRR 來指定這些區域以及需要訪問這些區域的裝置。作業系統應為這些裝置設定統一對映,以便訪問這些區域。

16.1.2. 什麼是 AMD IVRS?

該架構定義了一種與 ACPI 相容的資料結構,稱為 I/O 虛擬化報告結構 (IVRS),用於向系統軟體傳遞與 I/O 虛擬化相關的資訊。 IVRS 描述了平臺中包含的 IOMMU 的配置和功能,以及有關每個 IOMMU 虛擬化的裝置的資訊。

IVRS 提供有關以下內容的資訊

  • 平臺中存在的 IOMMU,包括它們的功能和正確的配置

  • 與每個 IOMMU 相關的系統 I/O 拓撲

  • 無法以其他方式列舉的外圍裝置

  • SMI/SMM、平臺韌體和平臺硬體使用的記憶體區域。 這些通常是由系統軟體配置的排除範圍。

16.2. 如何生成 I/O 虛擬地址 (IOVA)?

行為良好的驅動程式在向需要執行 DMA 的裝置傳送命令之前,會呼叫 dma_map_*() 函式。 DMA 完成且不再需要對映後,驅動程式會執行 dma_unmap_*() 函式來取消對映該區域。

16.3. Intel 特定說明

16.3.1. 圖形問題?

如果遇到圖形裝置問題,您可以嘗試新增選項 intel_iommu=igfx_off 來關閉整合圖形引擎。 如果這解決了任何問題,請確保您提交錯誤報告問題。

16.3.2. IOVA 的一些例外情況

中斷範圍未進行地址轉換 (0xfee00000 - 0xfeefffff)。 對等事務也是如此。 因此,我們從 PCI MMIO 範圍中保留地址,因此它們不會分配給 IOVA 地址。

16.4. AMD 特定說明

16.4.1. 圖形問題?

如果遇到整合圖形裝置的問題,您可以嘗試將選項 iommu=pt 新增到核心命令列,以便為 IOMMU 使用 1:1 對映。 如果這解決了任何問題,請確保您提交錯誤報告問題。

16.5. 故障報告

當報告錯誤時,IOMMU 透過中斷髮出訊號。 故障原因和導致故障的裝置會列印在控制檯上。

16.6. 核心日誌示例

16.6.1. Intel 啟動訊息

類似這樣的內容會被打印出來,表明 ACPI 中存在 DMAR 表

ACPI: DMAR (v001 A M I  OEMDMAR  0x00000001 MSFT 0x00000097) @ 0x000000007f5b5ef0

當 DMAR 正在被 ACPI 處理和初始化時,會列印 DMAR 位置和任何已處理的 RMRR

ACPI DMAR:Host address width 36
ACPI DMAR:DRHD (flags: 0x00000000)base: 0x00000000fed90000
ACPI DMAR:DRHD (flags: 0x00000000)base: 0x00000000fed91000
ACPI DMAR:DRHD (flags: 0x00000001)base: 0x00000000fed93000
ACPI DMAR:RMRR base: 0x00000000000ed000 end: 0x00000000000effff
ACPI DMAR:RMRR base: 0x000000007f600000 end: 0x000000007fffffff

當 DMAR 啟用使用時,您會注意到

PCI-DMA: Using DMAR IOMMU

16.6.2. Intel 故障報告

DMAR:[DMA Write] Request device [00:02.0] fault addr 6df084000
DMAR:[fault reason 05] PTE Write access is not set
DMAR:[DMA Write] Request device [00:02.0] fault addr 6df084000
DMAR:[fault reason 05] PTE Write access is not set

16.6.3. AMD 啟動訊息

類似這樣的內容會被打印出來,表明 IOMMU 的存在

iommu: Default domain type: Translated
iommu: DMA domain TLB invalidation policy: lazy mode

16.6.4. AMD 故障報告

AMD-Vi: Event logged [IO_PAGE_FAULT domain=0x0007 address=0xffffc02000 flags=0x0000]
AMD-Vi: Event logged [IO_PAGE_FAULT device=07:00.0 domain=0x0007 address=0xffffc02000 flags=0x0000]