IOMMU:外设为什么不能随便读写整台机器的内存?
TL;DR
IOMMU 为设备 DMA 提供地址转换与访问隔离,是虚拟机设备直通和受控用户态驱动的重要基础。本文说明它保护什么、不能保证什么。
IOMMU 为设备 DMA 提供地址转换与访问隔离,是虚拟机设备直通和受控用户态驱动的重要基础。本文说明它保护什么、不能保证什么。

网卡、显卡、存储控制器不只接收命令,也会通过 DMA(直接内存访问)读写主机内存。若设备可以随意指定物理地址,一个有故障或不可信的设备就可能触碰不属于它的数据。IOMMU(输入输出内存管理单元)可以理解为设备 DMA 的地址转换与隔离层:设备发出的地址先经过检查和映射,再决定它实际能访问哪些内存。
类比一下,普通 CPU 进程访问内存时会受到页表约束;IOMMU 则在“设备侧”提供相近的保护边界。操作系统可以为某个设备建立映射,让它只看到分配给它的缓冲区,而不必让设备直接掌握整台机器的物理内存。虚拟化场景中,这对于把设备安全地交给虚拟机或用户态驱动使用尤其重要。
Linux 的 VFIO 框架就利用 IOMMU 等机制支持受控的用户态设备访问。它让特定设备可以由用户空间程序直接管理,同时保留内存访问隔离。对于高性能设备,少一次内核数据通路可能有帮助;但用户态驱动仍要正确处理设备寄存器、队列、DMA 缓冲区和中断等复杂细节。IOMMU 解决的是 DMA 地址映射与隔离问题,不会自动修复驱动逻辑错误,也不保证设备本身没有漏洞。
隔离能力还取决于硬件拓扑。某些设备共享总线或 IOMMU group,不能被完全独立地划分;固件设置、平台能力和驱动支持也会影响可用性。开启 IOMMU 可能有额外的映射管理成本,具体影响依平台与工作负载而变。虚拟机直通并非只要“打开一个开关”就能安全完成,必须理解设备与隔离组的边界。
普通电脑用户通常不用手动管理 IOMMU,但它支持了云平台的设备虚拟化、PCIe 设备直通,以及更安全的高性能 I/O。若你在配置虚拟机直通或排查设备访问限制,IOMMU group、DMA 映射和 VFIO 是需要一起理解的概念。判断方案时,关注“设备究竟能访问哪段内存”比只看直通后速度更重要。
它把一个容易忽略的安全问题摆到台面上:外设也是会读写内存的参与者,硬件层的访问控制不能只围绕 CPU 设计。



