主要创建流程就是dev->vm->vcpu,这期间最重要的数据结构为kvm_x86_ops(在vmx.c中定义),但是在ioctl函数中展现的形式与实际调用的函数形式有些许不同. 如在创建vm时,函数调用流程为: kvm_dev_ioctl_create_vm()->kvm_create_vm()->kvm_arch_alloc_vm() 在kvm_arch_alloc_vm()中,具体实现只有一句return...
}; static long kvm_dev_ioctl(struct file *filp, unsigned int ioctl, unsigned long arg) { long r = -EINVAL; switch (ioctl) { case KVM_GET_API_VERSION: if (arg) goto out; r = KVM_API_VERSION; break; case KVM_CREATE_VM: r = kvm_dev_ioctl_create_vm(arg); break; case KVM_CHE...
1、QEMU创建虚拟机发起:kvm_ioctl(s, KVM_CREATE_VM, type); KVM中kvm_dev_ioctl判断参数-》kvm_dev_ioctl_create_vm-》kvm_create_vm该函数中创建并初始化了对应qemu模拟的内存条模型kvm->memslots【kvm结构体】 2、QEMU创建vcpu发起:kvm_vm_ioctl(s, KVM_CREATE_VCPU, (void *)kvm_arch_vcpu_id(cpu...
r = kvm_dev_ioctl_create_vm(arg); break; case KVM_CHECK_EXTENSION: r = kvm_vm_ioctl_check_extension_generic(NULL, arg); break; case KVM_GET_VCPU_MMAP_SIZE: if (arg) goto out; r = PAGE_SIZE; /* struct kvm_run */ #ifdef CONFIG_X86 r += PAGE_SIZE; /* pio data page */ ...
open( "/dev/kvm" ) ioctl(KVM_CREATE_VM) ioctl(KVM_CREATE_VCPU) for (;;) { ioctl(KVM_RUN) switch (exit_reason) { case KVM_EXIT_IO: case KVM_EXIT_HLT: } } 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. KVM内核模块本身只能提供CPU和内存的虚拟化,所以它必须结合QEMU才能构成一个完成的虚...
这个函数调用kvm_dev_ioctl_create_vm()创建虚拟机实例内核相关数据结构。该函数首先通过内核中kvm_create_vm()函数创建内核中kvm上下文struct kvm,然后通过函数Anno_inode_getfd(“kvm_vm”,&kvm_vm_fops,kvm,0)返回该虚拟机的文件描述符,返回给用户调用函数,由2中描述的函数赋值给用户态虚拟机上下文变量中的...
内核模式(Kernel Mode),运行KVM内核,实现模式的切换(VM Exit/VM Entry),执行特权与敏感指令。 KVM运行的基本如下图所示: KVM运行流程图 流程描述: 运行在用户态的Qemu-kvm通过ioctl系统调用操作/dev/kvm字符设备,创建VM和VCPU; 内核KVM模块负责相关数据结构的创建即初始化,然后返回用户态; ...
r = kvm_dev_ioctl_create_vm(arg); break; case KVM_CHECK_EXTENSION: r = kvm_vm_ioctl_check_extension_generic(NULL, arg); break; ... } 核心API 介绍了KVM设备对象和通信方式后,这里会介绍KVM API的三个调用层次,并列举说明核心的API:
kvm_dev_ioctl代码如下: staticlongkvm_dev_ioctl(struct file *filp,unsignedintioctl,unsignedlongarg){intr = -EINVAL; switch(ioctl) {caseKVM_GET_API_VERSION:if(arg)gotoout;r = KVM_API_VERSION;break;caseKVM_CREATE_VM:r = kvm_dev_ioctl_create_vm(arg);break;caseKVM_CHECK_EXTENSION:r = kvm...
kvm_dev_ioctl_create_vm 首先创建vm,然后挂载vmfd的ioctl接口来提供vm的控制 staticintkvm_dev_ioctl_create_vm(unsignedlongtype){ kvm = kvm_create_vm(type);//创建VMr = get_unused_fd_flags(O_CLOEXEC); file = anon_inode_getfile("kvm-vm", &kvm_vm_fops, kvm, O_RDWR);//挂载vmfd的ioctl...