原理
结合源码与图解,分析虚拟化机制的设计、实现和演进。
基础机制
虚拟化基础
理解虚拟机的组成,以及 CPU、内存、设备和中断如何共同完成一次请求。
CPU 虚拟化
客户机执行、退出处理、调度与时钟,以及 TCG 指令翻译、代码缓存和执行交接。
KVM vCPU 的阻塞、轮询与唤醒
从 HLT 跟踪宿主轮询、等待者发布与中断唤醒,分析丢失唤醒的防护和轮询预算的自适应调整。
KVM 虚拟时钟与定时器
从一次 1 毫秒定时任务出发,分析 TSC 变换、pvclock 共享时间基准、deadline 中断,以及暂停和迁移中的时间接续。
QEMU TCG 的翻译块与执行循环
从客户机指令到宿主代码,分析 TCG 中间表示、翻译块缓存、直接链接、代码失效与异常状态恢复。
KVM 嵌套虚拟化:VMCS 合成与退出转发
沿 L1 启动 L2 和一次端口写,解释 VMCS01、VMCS12、VMCS02 的状态合成,比较向 L1 转发、L0 内核处理和外层 QEMU 模拟三条路径。
虚拟 CPU 模型与迁移兼容性
从两台 x86 主机的指令差异出发,说明 CPU 模型、运行状态与机器类型的约束,以及兼容基线的选择和检查。
内存虚拟化
客户机内存的地址转换、映射与脏页跟踪。
KVM 内存映射与 EPT 缺页处理
从内存槽注册和一页 RAM 的首次访问出发,分析 EPT 建图、权限处理、宿主页失效及 TDP MMU 的演进。
KVM 大页映射的建立、拆分与恢复
区分客户机、宿主与 EPT 的页大小,跟踪 2 MiB 映射的建立、逐页脏日志期间的拆分,以及关闭跟踪后的原位恢复。
KVM 脏页日志:位图与 Dirty Ring
脏页记录的产生、收割与重置,以及重新保护、发布迁移位图和读取页面之间的顺序。
vCPU 与 NUMA 内存放置
分析客户机拓扑、线程亲和性、RAM 分配策略与 I/O 后端位置的配合,以及远端内存访问对延迟和带宽的影响。
设备与 I/O 虚拟化
从 virtqueue 与网络、存储、图形设备,到 vhost 后端、IOMMU 地址转换及直通设备管理。
virtio 设备初始化与特性协商
从 PCI 能力、状态握手到队列地址配置,跟踪一个 4 描述符队列如何开始工作,并区分失败、设备复位与队列复位。
QEMU 网卡模拟与 virtio-net 的发包路径
以相同的 TAP 后端对比 e1000 与 virtio-net,追踪描述符提交、队列通知、数据发送和完成处理。
virtio-net 的后端处理:vhost-net 与 vhost-user
对比 QEMU、内核 vhost-net 和独立用户态后端,分析队列初始化、kick/call 通知与报文处理路径。
DPDK vhost-user 的报文转发与缓冲区管理
从客户机 TX virtqueue 到 mbuf 和物理网卡,分析队列消费、复制边界、完成顺序与轮询成本。
SPDK vhost-user-blk 的请求处理路径
沿一次 4 KiB 写入,分析共享队列、控制器线程、bdev 和 NVMe 的请求交接,以及完成通知与资源释放。
VFIO 设备直通的 DMA 地址转换与隔离
从客户机缓冲区到宿主物理页,分析 DMA 映射、IOMMU 权限检查,以及 VFIO Container 与 IOMMUFD 的分工。
IOMMU:DMA 地址转换、缓存与失效
沿一块网卡的接收缓冲区,解释设备上下文、I/O 页表、IOTLB、权限检查与安全回收,区分数据访问和映射管理的成本。
IOMMUFD:设备绑定与 I/O 地址空间管理
沿一块 VF 的接入与回收,解释设备 fd、DEVICE、IOAS 和 HWPT 的关系,以及附着、映射、共享和失败回滚。
vIOMMU:客户机 DMA 映射与失效同步
沿同一 IOVA 从缓冲区 A 切换到 B,分析客户机页表、QEMU 合成映射、宿主 IOTLB 的同步,以及硬件嵌套转换的演进。
virtio-gpu:二维资源与画面更新
以一幅画面的局部更新,串起客户机 backing、QEMU 图像、scanout、TRANSFER 与 FLUSH,并比较二维显示与三维加速路径。
virtio-blk 的请求处理与写入完成
从一次 4 KiB 写入跟踪描述符链、块后端和完成回调,说明请求合并、缓存刷新与持久化之间的关系。
virtio-net 收包与 NAPI:缓冲区、通知和批处理
从 RX 缓冲区准备到报文交付协议栈,分析 QEMU 收包、used 完成、NAPI 预算与通知恢复竞态。
Packed virtqueue:描述符发布、完成与回绕
用四槽共享环解释 AVAIL、USED、wrap 与 Buffer ID,分析描述符链、事件抑制和紧凑布局的取舍。
vhost-vDPA:队列配置、硬件数据路径与迁移
分析 vDPA 如何连接 virtio 队列和设备数据面,以及 DMA 映射、Shadow Virtqueue 与迁移能力的约束。
中断虚拟化
从设备完成事件到客户机中断处理,分析路由、注入与硬件加速。
virtio 完成通知与 KVM 中断注入
从 used ring 的完成发布出发,分析通知抑制、MSI-X 消息、LAPIC 状态及 irqfd 替代路径。
关键操作
虚拟机启动
从 Libvirt 请求到 QEMU 创建机器、KVM 初始化和客户机开始执行。
QEMU 虚拟机启动与 vCPU 初始化
以包含系统盘与网卡的 Q35 虚拟机为例,跟踪后端、KVM、CPU、内存与设备初始化,再到复位、固件和操作系统引导。
热迁移
内存迭代、停机控制、迁移流格式、多通道同步与后拷贝缺页处理。
QEMU 预拷贝迁移的内存迭代与停机控制
脏页跟踪、内存重传与切换条件,以及带宽、写入负载和停机时间之间的关系。
QEMU 迁移流格式与状态恢复
从流头、内存页记录到 vCPU 与设备状态,逐层解析迁移流的字段、分段和结束标记,说明目的端如何恢复虚拟机状态。
QEMU MultiFD 的任务分发与跨通道同步
内存页批次的并行发送、主通道与数据通道的同步,以及慢通道对接收进度的影响。
QEMU 后拷贝迁移的缺页处理与页面传输
分析目的端接管后的缺页请求、页面安装、线程唤醒与后台传输,以及后拷贝的收敛收益和故障代价。
VFIO 设备热迁移:设备状态与 DMA 交接
跟踪直通网卡在源端和目的端之间的状态交接,区分 RAM 脏页与设备内部状态,分析预拷贝、停止 DMA、恢复校验和失败边界。
Libvirt 热迁移的阶段协调与失败恢复
沿 Begin、Prepare、Perform、Finish、Confirm 追踪双端交接,比较客户端与 p2p 协调,解释断线确认、存储归属与 postcopy 恢复边界。
热插拔
设备、CPU 与内存的在线增删、客户机通知和资源回收。
QEMU PCIe 设备热插拔与异步移除
从端口拓扑、插槽事件到客户机停用与对象回收,分析设备添加、异步删除和管理程序的完成判断。
virtio-mem 的内存添加与回收
从目标容量到客户机页面隔离,分析 virtio-mem 的块协议、Linux 内存上线与异步回收,并观察扩缩容阻塞与重试。
x86 vCPU 热插拔:拓扑、上线与异步移除
区分最大拓扑、已创建 vCPU 和客户机在线 CPU,跟踪 QMP、ACPI 通知、客户机下线与删除完成事件。
热升级
QEMU 同机进程替换中的共享内存、状态恢复、兼容性与失败边界。
内部机制
QEMU 内部机制
进程初始化、QOM / qdev、内存模型、QMP 和事件循环。
QEMU 对象模型与设备初始化
从 virtio-net-pci 的创建过程出发,分析 QOM 类型、对象组合、属性配置与设备生命周期。
QEMU 内存初始化与地址空间管理
以 Q35 的 8 GiB RAM 为例,分析宿主后备分配、高低端内存布局、FlatView 与 KVM 注册,再用交互演示解释别名和区域覆盖。
QEMU AioContext、协程与 IOThread
沿一次文件写请求,分析事件分发、协程挂起与恢复、队列到 IOThread 的映射,以及多线程块层的同步边界。
QEMU qcow2 的地址映射与写时复制
从 L1/L2 和引用计数跟踪一次 4 KiB 写入,分析共享簇、backing file、元数据更新顺序与子簇映射。
QEMU 外部快照与在线块操作
从 A、B、C 镜像链和同一偏移的数据变化出发,比较 stream、commit、mirror 与 backup,解释活动盘切换、作业状态和取消边界。
KVM 内部机制
内核对象、vCPU 请求与跨 CPU 协调,联系执行循环、内存映射及事件处理。
KVM vCPU 请求与跨 CPU 同步
跟踪一次远端 TLB 刷新,解释请求位图、vCPU kick、进入竞争,以及 IPI 确认与操作完成之间的边界。
Libvirt 内部机制
守护进程启动、连接与驱动选择、RPC 编解码和调用分发。
Libvirt RPC 的编码与调用分发
以一次虚拟机信息查询为例,解析 RPC 报文、XDR 编码、服务端分发与响应匹配,并说明守护进程拆分后的调用边界。