此篇文檔介紹了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但是實際上系統卻並沒有打開它的情況。