创建vCPU,并根据 NUMA Topo 配置为 vCPU 分配 vMemory。KVM_CREATE_VCPU 时,KVM 为每一个 vCPU 生成对应的 fd,对其执行相应的 ioctl 调用,就可以对 vCPU 进行管理。 ioctl(kvmfd, KVM_CREATE_VCPU, vcpuid); vcpu->kvm_run_mmap_size = ioctl(kvm->dev_fd, KVM_GET_VCPU_MMAP_SIZE, 0); 创建vCPU ...
它可以理解成KVM 为了某个特定的虚机创建对应的内核数据结构,同时,KVM 返回一个文件句柄来代表所创建的虚机。 针对该句柄的调用可以对虚机做相应地管理,比如创建用户空间虚拟地址和客户机物理地址、真实物理地址之间的映射关系,再比如创建多个 vCPU。KVM 为每一个 vCPU 生成对应的文件句柄,对其相应地 IOCTL 调用,就可...
unsignedintioctl, unsignedlongarg) {structkvm *kvm = filp->private_data;void__user *argp = (void__user *)arg;intr;if(kvm->mm != current->mm)return-EIO;switch(ioctl) {caseKVM_CREATE_VCPU: r=kvm_vm_ioctl_create_vcpu(kvm, arg);break;caseKVM_ENABLE_CAP: {structkvm_enable_cap cap;...
(1)运行在用户态的Qemu-kvm通过ioctl系统调用操作/dev/kvm字符设备,创建VM和vCPU。 (2)KVM内核模块负责相关数据结构的创建和初始化,然后返回用户态。 (3)Qemu-kvm通过ioctl调用运行vCPU,即调度相应的虚拟机运行。 (4)KVM内核进行相关处理后,执行VMLAUNCH指令,通过VM-Entry进入虚拟机操作系统运行,虚拟机操作系统运行...
KVM 为每一个 vCPU 生成对应的文件句柄,对其相应地 IOCTL 调用,就可以对vCPU进行管理。其中最重要的就是“执行虚拟处理器”。通过它,虚机在 KVM 的支持下,被置于虚拟化模式的非根模式下,开始执行二进制指令。在非根模式下,所有敏感的二进制指令都被CPU捕捉到,CPU 在保存现场之后自动切换到根模式,由 KVM 决定...
ret = ioctl(vcpu_fd, KVM_RUN, 0); 1. 此时ioctl函数对应的实现为virt/kvm/kvm_main.c中kvm_vcpu_ioctl函数,若传入的参数为KVM_RUN,它最终会调用vcpu_enter_guest函数进入guest vm. qemu作为一个user mode的程序,其入口为main函数,该main函数定义在vl.c文件中.main函数比较长,其中跟KVM初始化相关的主要...
1)KVM内核模块,它属于标准Linux内核的一部分,是一个专门提供虚拟化功能的模块,主要负责CPU和内存的虚拟化,包括:客户机的创建、虚拟内存的分配、CPU执行模式的切换、vCPU寄存器的访问、vCPU的执行。 2)QEMU用户态工具,它是一个普通的Linux进程,为客户机提供设备模拟的功能,包括模拟BIOS、PCI/PCIE总线、磁盘、网卡、显...
KVM 为每一个 vCPU 生成对应的文件句柄,对其相应地 IOCTL 调用,就可以对vCPU进行管理。其中最重要的就是“执行虚拟处理器”。通过它,虚机在 KVM 的支持下,被置于虚拟化模式的非根模式下,开始执行二进制指令。在非根模式下,所有敏感的二进制指令都被CPU捕捉到,CPU 在保存现场之后自动切换到根模式,由 KVM 决定...
1、运行在用户态的Qemu-kvm通过ioctl系统调用操作/dev/kvm字符设备,创建VM和VCPU; 2、内核KVM模块负责相关数据结构的创建即初始化,然后返回用户态; 3、Qemu-kvm通过ioctl调用运行VCPU,即调度相应的VM运行; 4、内核进行相关处理后,执行VMLAUNCH指令,通过VM-Entry进入Guest OS运行,Guest OS运行于非根模式下; 5、Gues...