虚拟化之路-KVM侧创建虚拟机流程(简介)

在QEMU侧kvm_init函数调用“/dev/kvm”设备的ioctl(KVM_CREATE_VM)接口,在KVM侧创建一台虚拟机。一个QEMU进程就是一台虚拟机,KVM中使用kvm结构体表示虚拟机。

KVM模块初始化的时候会注册“/dev/kvm”设备,该设备在内核中对应的ioctl函数是kvm_dev_ioctl,该函数实现了所有KVM层面的ioctl,对于KVM_CREATE_VM对应的处理函数是kvm_dev_ioctl_create_vm。

kvm_dev_ioctl_create_vm函数首先调用kvm_create_vm函数创建虚拟机实例,一个虚拟机实例使用一个kvm结构体表示。调用函数kvm_coalesced_mmio_init对合并MMIO初始化,主要是分配一个内存页,合并MMIO指的是将MMIO的写请求放到一个环中,等到其他事件产生或者环满了触发VM-Exit,然后进行MMIO的处理。anon_inode_getfile函数创建一个匿名file,其file_operations设置为kvm_vm_fops,其私有数据就是刚刚创建的虚拟机,该file对应的fd返回给用户态QEMU,表示一台虚拟机,QEMU之后就可以通过该fd对虚拟机进行操作了。

kvm_create_vm函数首先调用kvm_arch_alloc_vm函数分配一个KVM结构体,用来表示一台虚拟机。(KVM结构体涉及的数据较多,相关成员等遇见时在进行分析)。接着对kvm结构体的相关成员进行初始化。

kvm_create_vm函数接着调用kvm_arch_init_vm初始化与架构相关的数据。调用函数hardware_enable_all开启VMX模式,该函数会在创建第一个虚拟机时对每个CPU调用hardware_enable_nolock,最终调用kvm_arch_hardware_enable函数。

kvm_arch_hardware_enable函数主要调用Intel VMX实现的hardware_enable回调函数,该函数设置CR4的VMXE位,调用VMXON指令开启VMX。

kvm_create_vm函数调用kvm_alloc_memslots函数为虚拟机分配内存插槽,具体讲解见内存虚拟化。为KVM结构体中类型为kvm_io_bus的成员buses分配空间。kvm_io_bus与Linux中的总线结构没有关系,其作用是将内核中实现的模拟设备连接起来,有多种总线类型,如KVM_MMIO_BUS和KVM_PIO_BUS等。

kvm_create_vm函数调用kvm_init_mmu_notifier函数主要是注册一个MMU的通知事件。kvm_init_mmu_notifier是有编译选项决定的,编译内核时配置CONFIG_MMU_NOTIFIER和KVM_ARCH_WANT_MMU_NOTIFIER时,会注册一个MMU的通知事件,不配置时为空,不执行任何操作。然后使用内核的spink_lock机制,将创建的所有虚拟机都挂载到以vm_list为头节点的链表上。preempt_notifier_inc函数用于将VCPU线程调度到和调度出CPU。

代码流程如下所示。

展开阅读全文

页面更新:2024-05-11

标签:虚拟机   体表   初始化   内核   函数   分配   流程   内存   成员   结构   简介   设备

1 2 3 4 5

上滑加载更多 ↓
推荐阅读:
友情链接:
更多:

本站资料均由网友自行发布提供,仅用于学习交流。如有版权问题,请与我联系,QQ:4156828  

© CopyRight 2008-2024 All Rights Reserved. Powered By bs178.com 闽ICP备11008920号-3
闽公网安备35020302034844号

Top