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]