x86/kvm/vmc.c // x86平台和CPU相关的虚拟化 VT-X
x86/kvm/x86.c // x86平台kvm虚拟化
virt/kvm/kvm_main.c // 虚拟化模块(可类比xx-core)
简单几个重要数据结构。// 一个虚拟机,对应一个进程,一个虚拟vcpu,对应一个线程
kvm_host.h
struct kvm
{
struct kvm_vcpu *vcpus[KVM_MAX_VCPUS];
struct list_head vm_list; // 用于挂到全局vm_list列表
struct kvm_arch arch; // 平台相关
}
// 和虚拟机一一对应。
x86
struct vcpu_vmx
{
struct kvm_vcpu vcpu;
}
// 单个虚拟机的单个虚拟CPU。
struct vmcs {
u32 revision_id;
u32 abort;
char data[0];
}; // 每个物理CPU一个 vmxarea
kvm模块初始化
kvm_init()
{
kvm_arch_init(); // 平台初始化
kvm_irqfd_init(); // 创建kvm-irqfd-cleanup workqueue
kvm_arch_hardware_setup();
//检查每一个处理器的兼容性;
//注册监听CPU up/down;
//注册监听系统重启;
//分配存放kvm_vcpu cache;
//分配存放异步错误(pf)cache;
//注册/dev/kvm;
//注册syscore_ops;
//注册类别为kvm_dev_type_vfio kvm_device_ops;
}
创建虚拟机
kvm_dev_ioctl_create_vm()
{
kvm_create_vm()
{
// 分配kvm;
// 初始化kvm;
// hardware_enable_all
// 如果是第一个创建的虚拟机,针对每一个物理CPU,执行kvm_arch_hardware_enable
// 根据系统支持的memslots个数,为kvm分配对应memslots
// 根据系统支持的buses类别数,为kvm分配对应buses
// 初始化kvm的mmu_ontifier.ops,并注册到系统中
}
// 创建kvm-vm文件节点(ops为kvm_vm_fops,如创建vcpu),返回给上层应用,供后续使用
}
创建vCPU
kvm_vm_ioctl_create_vcpu()
{
//kvm_arch_vcpu_create-->vmx_create_vcpu
// 分配vcpu_vmx
// kvm_vcpu_init-->kvm_arch_vcpu_init
// vcpu_vmx //初始化
//kvm_arch_vcpu_setup-->vcpu_load;kvm_vcpu_reset;kvm_mmu_setup;vcpu_put
//create_vcpu_fd 创建kvm-vcpu(kvm_vcpu_fops,如KVM_RUN操作) inode,返回给上层使用
}