当前位置: 首页 > news >正文

iommu与virtio

Virtio:虚拟机里的 “虚拟设备总线”

  • 作用:让虚拟机(Guest)高效使用宿主机(Host)提供的虚拟设备
    • 虚拟网卡:virtio-net
    • 虚拟磁盘:virtio-blk
    • 虚拟显卡:virtio-gpu
    • 虚拟 IOMMU:virtio-iommu
  • 本质:前后端通信协议 + 共享内存队列(Virtqueue)
  • 特点:半虚拟化,性能远好于纯模拟(e1000、AHCI)

IOMMU:I/O 内存管理单元(硬件 / 虚拟)

  • 作用:给外设 DMA 做地址翻译 + 访问控制
  • 两种形态:
    1. 物理 IOMMU:Intel VT-d / AMD-Vi / ARM SMMU
    2. 虚拟 IOMMU:virtio-iommu(纯软件模拟)
  • 核心能力:
    • 设备只能访问指定内存区域
    • 隔离设备,防止越权 DMA
    • 支持 PCI 直通、VFIO

Virtio 和 IOMMU 的关系:三层关系

第一层:普通 Virtio 设备不需要IOMMU

默认情况下:

  • virtio-net、virtio-blk 直接读写 Guest 物理内存(GPA)
  • Host QEMU 负责翻译 GPA → HPA
  • 完全不需要 IOMMU 参与

这是绝大多数云主机的默认状态。

第二层:Virtio 设备可以开启 IOMMU 保护(安全模式)

开启后:

  • Guest 内核通过IOMMU 为 virtio 设备分配 IOVA
  • 设备 DMA 必须走 IOVA → GPA 翻译
  • 即使设备被恶意控制,也只能访问限定内存
  • 更安全,符合虚拟化安全规范

QEMU 开启方式:

-device virtio-net-pci,iommu_platform=on

第三层:专门的虚拟设备 ——virtio-iommu

这是一个独立的 virtio 设备,功能就是:在 Guest 内部模拟一个完整 IOMMU

它和其他 virtio 设备是并列关系:

  • virtio-net:虚拟网卡
  • virtio-blk:虚拟磁盘
  • virtio-iommu:虚拟 IOMMU

为什么要把 Virtio 和 IOMMU 放一起用?

1. 安全隔离(最重要)

  • 不让虚拟设备能访问整个 Guest 内存
  • 防止恶意设备 DMA 攻击
  • 满足机密计算、安全容器、可信虚拟化要求

2. 兼容 VFIO 框架

  • Guest 内部要用 VFIO 把设备给用户态 / 容器
  • 必须有 IOMMU 支持
  • 无硬件 IOMMU 时,用virtio-iommu模拟

3. 跨架构统一 IOMMU 体验

  • x86 VT-d、ARM SMMU 接口不同
  • virtio-iommu 提供一套标准协议
  • 虚拟机跨平台迁移兼容性更好

4. 嵌套虚拟化需要

在虚拟机里再开虚拟机(嵌套 KVM),需要:

  • 内层虚拟机看到一个 IOMMU
  • 只能用 virtio-iommu 提供

数据流对比

无 IOMMU 时 Virtio 数据流

Guest 驱动 → Virtqueue → QEMU → 直接读写 GPA

无翻译、无隔离。

有 IOMMU 时(物理或虚拟)

Guest 驱动 → IOMMU 分配 IOVA → 设备用 IOVA 发起 DMA → IOMMU 翻译 IOVA → GPA → QEMU 翻译 GPA → HPA

多一层地址翻译 + 权限检查

Virtio 设备 + 物理 IOMMU(VT-d/SMMU)

宿主机开启物理 IOMMU 时:

  • Host 用 IOMMU 把虚拟机整体隔离
  • Host 限制虚拟机只能访问自己的内存
  • 虚拟机内部再用 virtio 或 virtio-iommu

结构:

Host IOMMU(硬件) ↓ VM 隔离 ↓ Guest 内部:virtio-iommu(虚拟) ↓ Virtio 设备

典型用于:

  • 安全云主机
  • 机密虚拟机(SEV/TDX)
  • 强隔离多租户环境

物理 IOMMU vs 虚拟 IOMMU

一句话先讲透:

  • 物理 IOMMU:真实硬件,负责宿主机 → 物理设备的 DMA 安全与隔离
  • 虚拟 IOMMU:软件模拟(QEMU/KVM),负责虚拟机 → 虚拟设备的 DMA 安全与隔离
对比项物理 IOMMU虚拟 IOMMU
实现方式硬件单元(CPU/PCIe 根复合体内置)纯软件模拟(QEMU / 虚拟化栈)
工作位置Host 侧,管理真实物理设备Guest 侧,管理虚拟机里的虚拟设备
翻译路径IOVA → 物理地址 (PA)IOVA → 虚拟机物理地址 (GPA)
性能极高,硬件并行翻译,无开销较低,需要陷入 Hypervisor、队列交互
功能完整度完整:ATS/PRI/PASID/ 中断重映射基础:MAP/UNMAP/ATTACH/ 故障上报
依赖条件必须 CPU + 主板支持 VT-d / AMD-Vi / SMMU不依赖硬件,任何机器都能开
主要作用虚拟机独占物理设备(PCI 直通)虚拟机内部做安全隔离、嵌套虚拟化

存在位置不同

物理 IOMMU

  • 宿主机硬件上
  • Intel VT-d / AMD-Vi / ARM SMMU
  • 管控所有真实 PCIe 设备:GPU、网卡、NVMe、HBA

虚拟 IOMMU

  • 虚拟机内部
  • 由 QEMU 模拟成一个虚拟设备
  • 常见两种:
    • virtio-iommu(标准通用)
    • intel-iommu(模拟 VT-d,仅 x86)

地址翻译路径完全不同

物理 IOMMU 路径

设备 DMA → IOVA → 物理IOMMU → 物理内存(PA)

虚拟 IOMMU 路径

虚拟设备 DMA → IOVA → 虚拟IOMMU → GPA → 物理IOMMU → HPA

多一层软件翻译,性能自然更低。

性能差距巨大

  • 物理 IOMMU
    • 硬件并行处理
    • 自带 IOTLB 缓存
    • 几乎无性能损耗
  • 虚拟 IOMMU
    • 每次映射 / 解绑都要 VM Exit / VM Enter
    • 依赖 virtqueue 交互
    • 高 I/O 场景性能下降明显

功能支持差距

物理 IOMMU 支持

  • 多级地址翻译(Stage1 + Stage2)
  • PASID / SVA(设备共享进程虚拟地址)
  • ATS / PRI(设备 TLB、缺页)
  • 中断重映射、防中断注入
  • 完整的故障上报与隔离

虚拟 IOMMU(virtio-iommu)

只支持基础功能:

  • 映射 / 解绑 IOVA
  • 设备绑定到域
  • 简单故障上报高级功能基本没有。

使用场景完全不同

物理 IOMMU 用来做什么?

  • PCIe 设备直通(Passthrough)把显卡、网卡直接给虚拟机独占
  • SR-IOV 硬件虚拟化
  • 宿主机强安全隔离
  • 防止物理 DMA 攻击

虚拟 IOMMU 用来做什么?

  • 虚拟机内部需要IOMMU 驱动的场景
  • 虚拟机里跑 VFIO、用户态驱动
  • 嵌套虚拟化(虚拟机里再开虚拟机)
  • 不支持硬件 IOMMU 的老机器,也要安全 DMA
  • 跨平台统一 IOMMU 行为(x86 / ARM 都一样)

总结

  • Virtio:虚拟机设备的通用高效通信协议
  • IOMMU:给设备 DMA 做地址翻译与内存隔离
  • Virtio + IOMMU
    • 要么是给 virtio 设备加安全保护
    • 要么是用 virtio-iommu 这个虚拟设备,在 Guest 里模拟一个 IOMMU
http://www.jsqmd.com/news/679551/

相关文章:

  • RAG系统上下文长度管理:挑战与解决方案
  • 告别抖动与发热:用Arduino定时器中断精准驱动步进电机(附完整代码)
  • 长沙见!openEuler Developer Day 2026 日程新鲜出炉,共赴 AI 开源年度盛宴
  • 2026年程序员必看!AI大模型领域薪资狂飙4.2W+,高薪背后人才缺口达47万!
  • LARS回归模型:高维数据特征选择与Python实现
  • 手把手教你为STM32F4移植RT-Thread Nano和LWIP 1.4.1(含DP83848驱动避坑指南)
  • Keras实现经典CNN模块:VGG、Inception与ResNet实战
  • 2026 Google Play开发者上架全攻略:提升审核通过率的10个关键技巧
  • 告别卡顿!Android布局优化实战:用<include>、<merge>和ViewStub提升App流畅度
  • Dev-CPP:重新定义轻量级C/C++开发体验的5大革新
  • 计算机毕业设计:Python农产品销售数据可视化分析平台 Flask框架 数据分析 可视化 机器学习 数据挖掘 大数据 大模型(建议收藏)✅
  • 实战避坑:泛微E9流程接口与单点登录(SSO)开发全解析(含自定义Action、Restful API与免密登录)
  • 堆叠LSTM原理与实践:时序数据建模深度解析
  • 避开这3个坑,你的LSTM锂电池健康度预测模型才能更准:基于NASA数据集的实战经验
  • Dify文档解析配置失效应急包(内含debug日志解码表+chunk_size黄金公式):运维团队凌晨三点还在查的日志真相
  • 从X310到X410:升级USRP硬件后,我的Ubuntu开发环境配置踩了哪些坑?
  • 静态IPvs动态IP代理:区别解析与多场景选型指南
  • 从零构建甲状腺结节分割数据集TN3K:数据标注、多任务网络TRFE-Net实战与避坑指南
  • 保姆级教程:用conda彻底解决PyTorch与CUDA版本冲突(附环境导出与复现指南)
  • 老Mac装Win11避坑大全:解决A1278蓝屏、无声和绕过TPM的保姆级教程
  • 别再乱配PATH了!Mac新手必看的.zshrc、.bash_profile环境变量保姆级教程(含Flutter/Java/Android实战配置)
  • Loom + Project Reactor双栈升级成本失控真相,一线团队实测6大节流策略,仅剩23%企业掌握
  • 2026年工业平板技术解析:工业平板电脑/工业计算机厂家/全国产化主板/国产化电脑定制/嵌入式工控机/工业平板/选择指南 - 优质品牌商家
  • Spring Boot项目里用dynamic-datasource,@DSTransactional和@Transactional到底该用哪个?一次讲清
  • 2026稳压电源应用白皮书:100KW变频电源/50K变频电源/单相变频电源/双向电源/反馈式稳压电源/可程式变频电源/选择指南 - 优质品牌商家
  • 计算机毕业设计:Python农业气候与粮食产量分析平台 Django框架 数据分析 可视化 机器学习 深度学习 大数据 大模型(建议收藏)✅
  • TPFanCtrl2:Windows 10/11上ThinkPad双风扇智能控制终极指南
  • Robocup3D环境搭建后,如何用RoboViz进行3D可视化调试与实战?
  • PAJ7620U2手势模块的上电唤醒,为什么我建议你仔细看这篇FPGA调试避坑指南?
  • Loom虚拟线程上线即崩?20年JVM专家复盘17个生产环境血泪案例(含Arthas诊断模板)