此篇文档介绍了IOMMU相关的信息:
https://blog.chaosjohn.com/Check-VT-D-or-IOMMU-under-Linux.html
iommu和vt-d都是io半虚拟化的一种技术,两者很接近,只不过iommu是AMD的,vt-d是Intel的。
IO半虚拟化对比IO虚拟化,主要是虚拟机可直接和IO设备通信,而不必走VMM虚拟出来的虚拟IO设备。举例来说,VMguest系统可以直接访问物理显卡并调用其资源,而不必通过VMM虚拟出来的显卡调用资源。
linux中检查IOMMU是否开启
一般可以在主板BIOS/UEFI中可以找到,但是如果该硬件不支持虚拟化或者硬件固件被阉割但是实际上vt-d/iommu是被启用的。所以通过BIOS/UEFI固件并不能保证一定可以看到IOMMU信息。
正确的方法是通过dmesg命令查看。因为如果vt-d或者ioMmu开启并被使用,系统就会配置和启动DMA重映射,所以通过观察DMA是否启动来得知iommu是否开启。
执行以下命令:
dmesg | grep -i dmar
可以得到如下结果:
[ 0.144034] DMAR: IOMMU enabled
[ 0.779260] DMAR: Host address width 52
...
[ 0.779305] DMAR-IR: Queued invalidation will be enabled to support x2apic and Intr-remapping.
[ 0.781570] DMAR-IR: Enabled IRQ remapping in x2apic mode
...
[ 3.776139] DMAR: Intel(R) Virtualization Technology for Directed I/O
可以看到有“IOMMU enabled”的信息,这说明此运行时系统打开了IOMMU。
除了用dmesg,还可以通过cat /proc/cmdline
指令查看iommu是否打开。cmdline中的参数会被内核执行命令行时获取并解析,但不代表该一定能够起作用,也有发现cmdline中某配置被设置为enabling但是实际上系统却并没有打开它的情况。