I/O 虚拟化原理

张开发
2026/4/8 0:33:54 15 分钟阅读

分享文章

I/O 虚拟化原理
物理设备只有一套但虚拟机有多个必须解决隔离VM 不能乱访问别人设备复用一个物理设备给多个 VM 用透明VM 里驱动不用改以为在用真实硬件三大地址模型和内存一一对应GPAGuest 物理地址HPAHost 真实物理地址GIOADDRGuest 看到的 IO 地址 (MMIO/Port IO)HIOADDRHost 真实 IO 地址I/O 虚拟化本质把 VM 发出的 IO 请求 → 翻译、拦截、转发 → 给真实硬件。三种实现方式纯软件模拟QEMU 全模拟最早、最慢VMM/QEMU 模拟一个假设备e1000、virtio-net 纯模拟VM 写 IO/MMIO → VM Exit → QEMU 模拟寄存器 → 操作真实驱动优点兼容性极强缺点一次 IO 大量 VM Exit性能极差┌─────────────────────────────────────────────────────────────┐ │ Guest VM │ │ ┌─────────┐ ┌──────────────────┐ ┌──────────────┐ │ │ │ App │────▶│ Guest OS Driver │────▶| 虚拟IO端口 │ │ │ └─────────┘ │ (原生真实驱动) │ │ 寄存器模拟 │ │ │ └──────────────────┘ └──────────────┘ │ └───────────────────────────┬─────────────────────────────────┘ │ VM Exit陷入Hypervisor │ ┌───────────────────────────▼─────────────────────────────────┐ │ QEMU 用户态进程 │ │ ┌──────────────────────────────────────────────────────┐ │ │ │ 设备模拟模块 (Device Emulation) │ │ │ │ - e1000 / rtl8139 / piix3-ide 等真实硬件模拟 │ │ │ │ - 模拟寄存器、DMA、中断、IO端口 │ │ │ └───────────────────────────┬──────────────────────────┘ │ └───────────────────────────────┼──────────────────────────────┘ │ 宿主机内核系统调用 │ ┌───────────────────────────────▼──────────────────────────────┐ │ Host Kernel │ │ ┌──────────────┐ ┌──────────────┐ ┌─────────┐ │ │ │ VFS/网络栈 │───────▶│ Host Driver │─────▶| 物理NIC │ │ │ └──────────────┘ └──────────────┘ | 硬盘 │ │ │ └─────────┘ │ └─────────────────────────────────────────────────────────────┘核心流程Guest 写 IO 端口 / 寄存器以为是真实硬件CPU 触发 VM Exit退出虚拟机KVM 把控制权交给 QEMUQEMU 模拟硬件行为读寄存器、处理指令QEMU 调用Linux 系统调用访问真实设备完成后VM Entry回到 Guest关键特点无前端驱动修改Guest 使用原生真实驱动兼容性最强任何 OS 都能跑性能最差一次 I/O 多次 VMExit 用户态切换完全软件模拟不依赖硬件虚拟化半虚拟化VirtIO现代通用、平衡前端驱动 (Guest) 后端 (Host/VMM) 共享内存 (Virtqueue)不模拟完整硬件Guest 装 VirtIO 驱动通过环形缓冲区virtqueue批量传数据减少 VM Exit大幅提升性能结构Guestvirtio-net/blk 驱动前端Hostvhost-net/vhost-blk后端可进内核数据通路共享内存直接读写几乎不陷出┌─────────────────────────────────────────────────────┐ │ Guest VM │ │ ┌─────────┐ ┌──────────────────────┐ │ │ │ App │────▶│ VirtIO Frontend 驱动 │ │ │ └─────────┘ │ (net/blk/console...) │ │ │ └──────────┬───────────┘ │ │ │ │ │ Virtqueue (vring) │ │ (共享内存三环形队列) │ │ - Desc 描述符 │ │ - Avail 可用 │ │ - Used 已使用 │ └───────────────────────┬───────────────────────────┘ │ Kick(通知) ▼ ┌─────────────────────────────────────────────────────┐ │ Host 端 │ │ ┌───────────────────────────────────────────────┐ │ │ │ VirtIO Backend │ │ │ │ ┌───────────────────────────┐ │ │ │ │ │ 两种实现 │ │ │ │ │ QEMU 后端(用户态) Vhost(内核态) │ │ │ └───────────────────────────┬───────────────────┘ │ └──────────────────────────────┼──────────────────────┘ │ ▼ ┌─────────────────────────┐ │ 物理 NIC / 磁盘 │ └─────────────────────────┘极简数据流Guest 应用 →VirtIO 前端驱动前端把 I/O 请求放入Virtqueue共享内存前端发kick通知 HostHostBackendQEMU 或 vhost处理请求访问物理设备结果写回 Virtqueue → 发中断给 GuestVirtIO 三大核心Frontend前端Guest 里的 virtio 驱动Virtqueuevring共享内存无拷贝通信Backend后端Host 处理 I/O两种 BackendQEMU Backend用户态路径Guest → KVM → QEMU 用户态 → Host 内核VMExit 较多性能一般Vhost内核态路径Guest → KVM →vhost 内核模块直接处理减少 VMExit、减少用户态切换、性能大幅提升云服务器主流vhost-net、vhost-blk优点半虚拟化Guest 知道自己是虚拟机专用队列减少 VMExit共享内存零拷贝性能远好于 QEMU 全模拟云平台标准方案硬件辅助虚拟化SR-IOV性能最高Single Root I/O Virtualization单根 I/O 虚拟化 ——硬件层面把一个物理 PCIe 设备网卡 / 硬盘虚拟成多个独立虚拟设备让 VM 直接使用绕过 Hypervisor。物理网卡 / 硬盘支持SR-IOV把一个物理 PF虚拟出多个VF虚拟功能每个 VF 对 VM 来说就是真物理设备硬件直接 DMA、完全旁路 VMM/QEMU无 VM Exit、无软件转发、性能接近物理原生这是云计算高性能 IO 标准方案。┌─────────────────────────────────────────────────────┐ │ Guest VM 1 │ │ ↗ │ │ ┌───────────────┐ │ │ │ VF Driver │ (Virtual Function) │ │ └───────────────┘ │ └───────────────────────┬─────────────────────────────┘ │ ┌───────────────────────┼─────────────────────────────┐ │ │ │ │ PCIe 硬件层面 │ │ │ │ │ ┌────────────▼─────────────┐ │ │ │ SR-IOV NIC │ │ │ │ ┌─────────┐ ┌─────────┐│ │ │ │ │ PF │ │ VF1…n ││ │ │ │ │(物理功能)│ │(虚拟功能)││ │ │ │ └─────────┘ └─────────┘│ │ │ └────────────┬────────────┘ │ └───────────────────────┼─────────────────────────────┘ │ ┌───────────────────────▼─────────────────────────────┐ │ IOMMU (VT-d/AMD-Vi) │ │ (DMA地址重映射、隔离、安全保护) │ └─────────────────────────────────────────────────────┘SR‑IOV 完整工作流程物理网卡开启 SR‑IOVPF 创建多个 VF通过IOMMU将VF 直接分配给 VM通过IOMMU做地址隔离与 DMA 安全VM 内部加载VF 原生驱动VM 发送数据时直接操作 VF 硬件寄存器不触发 VMExit不经过 QEMU/KVM网卡硬件内部自动转发、隔离、调度VF 流量数据直接从 VM → VF → 物理网卡 → 外部网络全程不经过 QEMU、不触发 VMExitSR-IOV 核心概念PFPhysical Function物理功能完整 PCIe 功能管理 VF、配置硬件。VFVirtual Function轻量级虚拟 PCIe 功能只负责数据收发无管理权限。IOMMU硬件级地址转换、隔离保证 VM 之间安全、不越权访问。核心两个角色1. PFPhysical Function物理功能完整的 PCIe 功能拥有全部权限配置、管理、创建 VF只有宿主机可以控制 PF2. VFVirtual Function虚拟功能轻量级、精简的 PCIe 功能只有数据收发能力无配置权限直接分配给虚拟机 VM 使用一个 PF 可以分出多个 VF如 7/15/31 个核心硬件基础IOMMUIntel VT-d / AMD‑Vi功能GPA → HPA 地址转换虚拟机物理地址 → 主机物理地址DMA 重映射防止 VM 越权访问硬件隔离VM 之间完全独立核心特点硬件级 I/O 虚拟化性能最高、延迟最低、接近物理设备完全旁路 Hypervisor、QEMU 不参与数据路径无 VMExit、零拷贝SR‑IOV 让物理网卡硬件自己切分成多个虚拟 VFIOMMU 做安全隔离VM 直接读写硬件完全绕过 Hypervisor实现近原生性能 I/O 虚拟化。缺点不支持动态迁移live migration、不支持 ovs / 流控 / 端口镜像三种方式极简对比全模拟完全软件假设备 → 兼容好、极慢VirtIO前后端 共享队列 → 通用、高性能、需要驱动SR-IOV硬件分 VF → 性能接近物理、延迟最低、依赖硬件方案性能兼容性共享典型场景全模拟★☆☆☆☆最好是兼容旧 OSVirtIO★★★★☆好是云服务器通用SR-IOV★★★★★需硬件支持是硬件级高性能网络 / 存储┌───────────────┐ ┌───────────────┐ ┌───────────────┐ │ 全模拟 │ │ VirtIO │ │ SR-IOV │ │ QEMU Emulation│ │ Paravirtual │ │ Hardware │ └───────┬───────┘ └───────┬───────┘ └───────┬───────┘ │ │ │ │ VMExit最少 无VMExit │ │ │ ┌───────────────┐ ┌───────────────┐ ┌───────────────┐ │ 性能最差 │ │ 性能优秀 │ │ 性能最优 │ │ 兼容性最好 │ │ 云主力方案 │ │ 高性能场景 │ └───────────────┘ └───────────────┘ └───────────────┘核心关键机制MMIO 虚拟化设备寄存器一般在 MMIO 区域非虚拟化直接访问物理地址虚拟化EPT 把 GPA 标记为未映射→ 触发 EPT Violation → VM Exit → QEMU 模拟DMA 虚拟化IOMMU / VT-d / AMD-Vi和 MMU 对应但给设备用普通 MMUCPU VA → PAIOMMU设备 DMA 地址 → 真实物理地址作用防止 VM DMA 越权访问内存安全隔离支持 SR-IOV 直接分配没有 IOMMUSR-IOV 无法安全使用。中断虚拟化物理中断 → VMM 拦截 → 翻译成虚拟中断发给 VM技术Virtual APIC、MSI-X 虚拟化、Posted InterruptPosted Interrupt硬件直接投递中断不 VM Exit极致性能总结I/O 虚拟化 拦截 / 翻译 IO 指令 隔离 DMAIOMMU 虚拟中断 共享 / 直通硬件和内存虚拟化地址翻译 隔离是完全对称的设计。

更多文章