本页目录

KVM 内存与设备虚拟化

覆盖: EPT/NPT (stage-2 page table) → MMU 虚拟化 → virtio (半虚拟化) → VFIO (直通) → vhost (内核态加速) → virtio-net/virtio-blk 详解 内核版本: 2.6 ~ 6.x

内存虚拟化: EPT/NPT

三层地址转换:
  GVA (guest virtual address)
    → guest page table (guest OS 管理)
    → GPA (guest physical address)
      → EPT/NPT (KVM 管理, "stage-2 page table")
      → HPA (host physical address)

EPT (Intel Extended Page Tables) / NPT (AMD Nested Page Tables):
  硬件直接执行 GVA→GPA→HPA 的 2D page walk (24 步!)
  → 不需要 KVM 维护影子页表 (shadow page table)
  → 现代 CPU 皆有硬件支持

EPT violation: guest 修改自己的页表 → EPT 页表过期 → VM exit
  → KVM 更新 EPT 映射 → VMRESUME

MMU 虚拟化

// arch/x86/kvm/mmu/mmu.c
// KVM MMU 维护两种页表:
//   1. EPT 页表 (硬件使用): GPN → HPN
//   2. 影子页表 (仅无 EPT 的旧 CPU): GVA → HPA

// TDP (Two-Dimensional Paging) = EPT on Intel, NPT on AMD

// kvm_mmu_page_fault():
//   guest 访问 GPA → EPT violation → handle_ept_violation()
//     → kvm_mmu_map() → 在 EPT 中建立 GPA→HPA 映射
//     → 返回 guest

virtio: 半虚拟化 IO

// drivers/virtio/
// 设计原则: guest 知道自己在 VM 中 → 用共享内存(virtqueue)通信
//          不需要模拟真实硬件 → 极高的 IO 性能

// virtio 设备模型:
//   前端 (guest): virtio-blk, virtio-net, virtio-scsi, virtio-gpu
//   后端 (host): 
//     QEMU (软件模拟)
//     vhost (内核态加速: vhost-net, vhost-scsi, vhost-vsock)
//     vDPA (硬件加速: 网卡/smartNIC)

virtqueue: 共享环形缓冲

// virtio 的核心传输机制:
//   1. split virtqueue: 传统格式 (descriptor table + available ring + used ring)
//   2. packed virtqueue (1.1): 更紧凑, cache line 友好

// guest 提交 IO:
//   写 descriptor + available ring → kick (写 doorbell)
// host 消费:
//   取 descriptor → 处理 IO → 写 used ring → interrupt (MSI-X)
// guest complete:
//   中断 → 读 used ring → 释放 buffer

vhost: 内核态加速

// drivers/vhost/net.c
// vhost 把 virtio 数据路径移到内核:
//   guest → virtqueue → vhost (host 内核) → tap device → 协议栈
//   绕过 QEMU 用户态 → 延迟 ~50% 降低

// vhost-net:   网络 (最常用)
// vhost-scsi:  存储
// vhost-vsock: guest↔host 通信 (AF_UNIX 跨 VM 边界)

VFIO: 设备直通

// 将物理 PCIe 设备独占分配给 guest:
//   1. 从 host 解绑设备 (echo dev > /sys/bus/pci/drivers/xxx/unbind)
//   2. 绑定到 vfio-pci (echo vendor device > /sys/bus/pci/drivers/vfio-pci/new_id)
//   3. QEMU: -device vfio-pci,host=01:00.0
//   4. IOMMU 隔离: 设备 DMA 只能访问此 VM 的内存

// 性能: 接近裸机 (GPU, NVMe 直通给 guest)
// 限制: 不能在线迁移 (设备状态无法保存/恢复)

参考

  • 源码⁠: arch/x86/kvm/mmu/, drivers/virtio/, drivers/vhost/, drivers/vfio/
  • 内核文档⁠: Documentation/virt/kvm/, Documentation/driver-api/virtio/
  • LWN: "Virtio without the QEMU middleman (vhost)", "VFIO and device assignment"

关键词: EPT, NPT, stage-2 page table, virtio, virtqueue, vhost, VFIO, PCI passthrough