static int kvm_vm_ioctl_create_vcpu(struct kvm *kvm, u32 id) { int r; struct kvm_vcpu *vcpu; kvm->created_vcpus++; mutex_unlock(&kvm->lock); vcpu = kvm_arch_vcpu_create(kvm, id); preempt_notifier_init(&vcpu->preempt_notifier, &kvm_preempt_ops); r = kvm_arch_vcpu_setup(vcpu...
1.6 vcpu的生命周期 host通过线程来代表一个vcpu,其开始运行后guest将会在如下图所示的各状态之间不断地转换: (1)vcpu创建并初始化完成后,host的用户空间将通过KVM_RUN的ioctl进入内核空间切入guest运行。在切换流程中,先将切前的cpu寄存器保存到host上下文中,然后将guest上下文恢复到cpu寄存器中 (2)物理cpu切换到gu...
当用户态触发kvm_arch_vcpu_ioctl_run时,会让Guest OS去跑在Hypervisor上,当Guest OS中出现异常退出到Host时,此时handle_exit将对退出的原因进行处理; 异常处理函数arm_exit_handlers如下,具体调用选择哪个处理函数,是根据ESR_EL2, Exception Syndrome Register(EL2)中的值来确定的。 staticexit_handle_fn arm_exit...
VMM向上层提供/dev/kvm接口,/dev/kvm是一个标准的字符设备,通过ioctl接口控制;Qemu-kvm通过调用/dev/kvm设备的ioctl接口,对虚拟机进行相关控制,比如创建虚拟机、创建VCPU、运行虚拟机等; 为提升KVM虚拟机中的IO性能,KVM还提供了Virtio驱动,相当于Xen环境中的半虚拟化驱动。 1.2 KVM虚拟化架构 如下图,KVM虚拟化有...
2587 int kvm_init(void *opaque, unsigned int vcpu_size, 2588 struct module *module) 2589 { 2590 int r; 2591 int cpu; 2592 2593 r = kvm_arch_init(opaque); 2594 if (r) 2595 goto out_fail; 2596 2597 bad_page = alloc_page(
run_ret = kvm_vcpu_ioctl(cpu, KVM_RUN, 0); qemu_mutex_lock_iothread(); kvm_arch_post_run(cpu, run); if (run_ret < 0) { if (run_ret == -EINTR || run_ret == -EAGAIN) { DPRINTF("io window exit\n"); ret = EXCP_INTERRUPT; ...
然后VMM通过KVM_RUN 的ioctl运行vCPU,对于Realm VM, 这是通过kvm_arch_vcpu_ioctl_run ->kvm_rec_enter->rmi_rec_enter,rmi_rec_enter通过RMI REC_ENTER的调用(通过SMC指令)到ATF,ATF将它dispatch到TF-RMM,TF-RMM调用smc_rec_enter,然后通过rec_run_loop将物理CPU的执行转交给Realm EL0&EL1的Realm VM。
r = kvm_vm_ioctl_check_extension_generic(NULL, arg);break;caseKVM_GET_VCPU_MMAP_SIZE:if(arg) goto out; r = PAGE_SIZE;/* struct kvm_run */#ifdef CONFIG_X86 r += PAGE_SIZE;/* pio data page */#endif #ifdef KVM_COALESCED_MMIO_PAGE_OFFSET ...
Qemu-kvm通过ioctl调用运行VCPU,即调度相应的VM运行; 内核进行相关处理后,执行VMLAUNCH指令,通过VM-Entry进入Guest OS运行,Guest OS运行于非根模式下; Guest OS执行相应的虚拟机代码,非敏感指令可直接在物理CPU上运行; 当Guest OS中执行到敏感指令、发生外部中断、或Guest OS发生内部异常时,将产生VM-Exit,并将相关...
如果是KVM emulate的则由KVM emulate,然后切回Guest OS。如果是Qemu emulate的,则从KVM中进入Qemu,等Qemu中的device model执行完emulate之后,再次在Qemu中调用kvm_vcpu_ioctl(vcpu_fd, KVM_RUN, xxx)进入KVM运行,然后再切回Guest OS vm-entrykvm_vcpu_ioctl(kvm_main.c)-->kvm_arch_vcpu_ioctl_run(kvm/x86...