(4)打开/dev/kvm文件并获得文件描述符fd后,通过ioctl指令写入KVM_CREATE_KVM,即可创建一个虚拟机,并返回一个fd_vm的虚拟机文件描述符。 (5)获得fd_vm后,通过ioctl调用KVM_CREATE_VCPU指令,可以对fd_vm所对应的虚拟机创建vCPU,并对vCPU做初始化操作。 (6)然后通过KVM_RUN指令对fd_vcpus操作,启动运行虚拟机。
ioctl函数在kvm中的实现为virt/kvm/kvm_main.c中kvm_dev_ioctl函数,当传入的参数为KVM_CREATE_VM时,该函数会创建一个VM,并且返回一个fd,通过该fd可以操作虚拟机. 创建完虚拟机之后,需要在该虚拟机上面创建vcpu,调用的接口也是ioctl,只是此时对应的fd为创建虚拟机时返回的fd. vcpu_fd = ioctl(vm_fd, VM_CRE...
ioctl(KVM_CREATE_VM) ioctl(KVM_CREATE_VCPU) for (;;) { ioctl(KVM_RUN) switch (exit_reason) { case KVM_EXIT_IO: /* ... */ case KVM_EXIT_HLT: /* ... */ } } 虚拟机运行起来之后,当guest OS发出硬件中断或者其它的特殊操作时,KVM退出,QEMU可以继续执行,这时QEMU根据KVM的退出类型进行模...
(1)kvm_init_vcpu(1.1)通过ret =kvm_vm_ioctl(s,KVM_CREATE_VCPU, (void *)kvm_arch_vcpu_id(cpu));创建虚拟机的vcpu。对应到kvm的kvm_main.c中kvm_vm_ioctl函数,当传入的参数为VM_CREATE_VCPU时,与KVM_CREATE_VM过程类似,它创建一个vcpu并且返回可以操作该vcpu的vcpu_fd;(1.2)mmap_size = kvm_ioct...
1.使用ioctl KVM_CREATE_VM创建GVM,此时的GVM还是一个空壳 2.mmap一块内存,并通过ioctl KVM_SET_USER_MEMORY_REGION命令attach给1中创建好的GVM 3.使用read函数将kernel读取到2中mmap好的内存中合适的位置 4.使用ioctl KVM_CREATE_VCPU 创建一个vcpu; ...
内核模式(Kernel Mode),运行KVM内核,实现模式的切换(VM Exit/VM Entry),执行特权与敏感指令。 KVM运行的基本如下图所示: KVM运行流程图 流程描述: 运行在用户态的Qemu-kvm通过ioctl系统调用操作/dev/kvm字符设备,创建VM和VCPU; 内核KVM模块负责相关数据结构的创建即初始化,然后返回用户态; ...
device ioctl, 与vcpu ioctl类似,主要用于操控单个虚拟机设备。 2. File descriptors kvm API 以文件描述符为中心。 通过open("/dev/kvm")获得 kvm 子系统的句柄;此句柄可用于调用系统 ioctl。通过调用ioctlKVM_CREATE_VM将创建一个 VM 文件描述符,该描述符可用于发出 VM ioctl(第二类 ioctl)。 VM fd 上的...
对于Realm VMh还需要通过KVM_ARM_VCPU_FINALIZE kvm_arch_vcpu_ioctl系统调用, kvm_arm_vcpu_finalize kvm_create_rec->rmi_rec_create, 通过RMI REC_CREATE调用(通过SMC指令)到ATF,ATF再将此调用dispatch到TF-RMM,TF-RMM通过smc_rec_create在Realm状态创建对应于host Linux KVM struct kvm_vcpu的struct rec...
1)KVM内核模块,它属于标准Linux内核的一部分,是一个专门提供虚拟化功能的模块,主要负责CPU和内存的虚拟化,包括:客户机的创建、虚拟内存的分配、CPU执行模式的切换、vCPU寄存器的访问、vCPU的执行。 2)QEMU用户态工具,它是一个普通的Linux进程,为客户机提供设备模拟的功能,包括模拟BIOS、PCI/PCIE总线、磁盘、网卡、显...
KVM 为每一个 vCPU 生成对应的文件句柄,对其相应地 IOCTL 调用,就可以对vCPU进行管理。其中最重要的就是“执行虚拟处理器”。通过它,虚机在 KVM 的支持下,被置于虚拟化模式的非根模式下,开始执行二进制指令。在非根模式下,所有敏感的二进制指令都被CPU捕捉到,CPU 在保存现场之后自动切换到根模式,由 KVM 决定...