重要的数据结构和接口 一个快速分析,理解 KVM 实现的方法是了解其代码中一些重要数据结构和接口函数 : 1.struct kvm 和 struct kvm_arch。 用来描述单个虚拟机全局的状态, 如代表虚拟机物理内存区域的 memslots, 代表当前需要仿真的 Coalesced MMIO 的coalesced_mmio_ring, 用来仿真平台设备 PIC, IOAPIC, PIT,KVMCLOCK 的数据结构, 用来组织 Shadow 页表的数据结构等等。 2.struct kvm_vcpu 和 struct kvm_vcpu_arch。 用来描述单个虚拟 CPU 的状态, 如需要仿真的虚拟 CPU 的特征位 ( 客操作系统 CPUID 看到的东西), 当前尚未处理完的 PIO,等待注入的异常和中断事件,用来仿真 Local APIC 的数据结构,尚未同步到 VMCB 中的修改过的寄存器的缓存等等linux。 3.struct vmcb。 用来实现 AMD-V 的 VMCB 的数据结构。其中的字段的格式和长度当然需要严格遵守 VMCB 的规范。 两个子结构struct vmcb_control_area 和 struct vmcb_save_area 分别代表物理上的 VMCB.CONTROL 和 VMCB.SAVE。 4.Struct vcpu_svm。用来代表 AMD-V 实现下的 VCPU,除关联 struct kvm_vcpu 和 struct vmcb 外,还用来实现一些 AMD-V 特定的东西,如 ASID 和 Sysenter 的支持linux。 5.Struct kvm_memslots。 该结构挂在 struct kvm 下,用来描述虚拟机的全部物理内存区域, 每个区域对应一个 struct kvm_memory_slot 结构,其中包含该区域的 gpa 起点,大小及在 qemu-kvm 用户空间的 hva 起点。 6.Struct kvm_x86_ops。该接口定义了若干操作,规定 KVM 在x86 平台上的基本实现方式,svm.c 中提供了大部分操作的独立实现,其中多数函数以 “svm_xxx”方式命名,读者可直接查找 svm_x86_ops 变量了解每个操作在 svm.c 中对应的函数linux。 7.Struct kvm_io_dev_ops。该接口定义了三个操作 (read,write,destructor),规定了在 KVM 内核中 PIO 或 MMIO 仿真的实现结构,目前平台设备 PIT, PIC, IOAPIC 的 PIO/MMIO 仿真处理都是按该接口的方式实现的。有趣的是,Ioeventfd 机制也使用了该接口, Ioeventfd 实现该接口的 write 操作,当 KVM 截取客操作系统向某特定的 PIO 或 MMIO 地址写入某特定的值时,Ioeventfd 实现的 ioeventfd_write() 操作就会执行, 唤醒等待在指定的文件描述符上的qemu-kvm 线程。RHEL6.2 上 qemu-kvm 实现的 virtIO 设备的后端,已经使用了 ioeventfd 的功能。
|