KVM初始化/创建虚拟机和vCPU

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,返回给上层使用
}

                                                                             

猜你喜欢

转载自blog.csdn.net/jakec4/article/details/82698393