IOMMU的探测
如果机器上存在多个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
3acpidump -n DMAR -b
iasl -d dmar.dat
cat dmar.dsl
结合Intel VT-d spec的”BIOS Considerations”一节与ACRN hypervisor,慢慢去解析相关field。
蓝皮书中也有相关描述:
参考资料: