如果机器上存在多个IOMMU,怎么知道某设备使用哪个IOMMU呢?以这个问题为索引,引出本文。

Overview

Example

先看一个典型的x86物理服务器:

服务器上可以有多个DMAR Unit(这里可以直接理解为多个IOMMU硬件), 每个DMAR会负责处理其下挂载设备的DMA请求。 例如上图中, PCIE Root Port (dev:fun) (14:0)下面挂载的所有设备的DMA请求由DMAR #1负责处理, PCIE Root Port (dev:fun) (14:1)下面挂载的所有设备的DMA请求由DMAR #2负责处理, 而DMAR #3下挂载的是一个Root-Complex集成设备[29:0],这个设备的DMA请求被DMAR #3承包, DMAR #4的情况比较复杂,它负责处理Root-Complex集成设备[30:0]以及I/OxAPIC设备的DMA请求。 这些和IOMMU相关的硬件拓扑信息需要BIOS通过ACPI表呈现给OS,这样OS才能正确驱动IOMMU硬件工作。

BIOS通过在ACPI表中提供一套DMA Remapping Reporting Structure 信息来表述物理服务器上的IOMMU拓扑信息, 这样OS在加载IOMMU驱动的时候就知道如何建立映射关系了。

VT-d spec描述的更为详细!

实践

查看主机上的DMAR信息:

1
2
3
acpidump -n DMAR -b
iasl -d dmar.dat
cat dmar.dsl

结合Intel VT-d spec的”BIOS Considerations”一节与ACRN hypervisor,慢慢去解析相关field。

蓝皮书中也有相关描述:


参考资料:

  1. DMA Remapping Report ACPI Table
  2. Intel IOMMU Introduction