KVM初始化过程
来源:互联网 发布:app小额贷款软件 编辑:程序博客网 时间:2024/06/06 11:13
之前打算整理一下在Guest VM, KVM, QEMU中IO处理的整个流程,通过查阅资料和阅读源码,已经大致知道IO在Guest KVM中的处理流程.当想要整理IO在KVM和QEMU中的处理时,发现很难理清楚QEMU和KVM之间的跳转和交互的过程,于是促使自己去了解QEMU和KVM启动的过程.(本文展示的代码中,qemu版本为1.6.0, linux内核版本为3.7.10)
为了介绍qemu和kvm的交互过程,我首先介绍一下kvm给用户提供的接口.kvm是一个内核模块,它实现了一个/dev/kvm的字符设备来与用户进行交互,通过调用一系列ioctl函数可以实现qemu和kvm之间的切换.当要创建一个新的虚拟机时,首先打开/dev/kvm设备,在其上调用ioctl函数:
ioctl函数在kvm中的实现为virt/kvm/kvm_main.c中kvm_dev_ioctl函数,当传入的参数为KVM_CREATE_VM时,该函数会创建一个VM,并且返回一个fd,通过该fd可以操作虚拟机.创建完虚拟机之后,需要在该虚拟机上面创建vcpu,调用的接口也是ioctl,只是此时对应的fd为创建虚拟机时返回的fd.
此时ioctl函数对应的实现为virt/kvm/kvm_main.c中kvm_vm_ioctl函数,当传入的参数为VM_CREATE_VCPU时,与KVM_CREATE_VM过程类似,它创建一个vcpu并且返回可以操作该vcpu的fd.创建完vcpu后,可以在该vcpu上面调用ioctl函数进入guest vm.
此时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初始化相关的主要有两个函数:configure_accelerator()和machine->init(&args). cofigure_accelerator()函数选择运用哪一种虚拟化方案,其应用到的数据结构为accel_list,会调用accel_list[i].init函数.accel_list的初始化如下所示,当使用kvm虚拟化解决方案时,accel_list[i].init对应的函数即为kvm_init.
kvm_init函数定义在kvm-all.c文件中,其主要功能是打开/dev/kvm设备,创建一个虚拟机.machine->init(&arg)函数主要初始化硬件设备,并且调用qemu_init_vcpu为每一个vcpu创建一个线程,线程执行的函数为qemu_kvm_cpu_thread_fn.从qemu main到qemu_init_vcpu之间函数调用关系涉及到一些函数指针的赋值源码比较难于读懂,以下是使用gdb调试打出其调用关系.
qemu_kvm_cpu_thread_fn函数创建vcpu,然后调用kvm_cpu_exec函数.kvm_cpu_exec函数调用ioctl进入kvm并最终进入guest vm.
以上即为qemu调用kvm的接口初始化kvm的过程.后续我会整理出IO在kvm和qemu之间执行过程,同时描述kvm和qemu之间如何协同工作的.
参考资料:
1. qemu-kvm的初始化与客户系统的执行:http://blog.csdn.net/lux_veritas/article/details/9383643
2. 内核虚拟化kvm/qemu----guest os,kvm,qemu工作流程:http://www.360doc.com/content/12/0619/13/7982302_219186951.shtml
- KVM初始化过程
- KVM初始化过程
- KVM初始化过程
- Openstack的KVM的初始化过程
- KVM MMu初始化
- qemu-kvm设备初始化
- kvm module 初始化
- Qemu-KVM虚拟机初始化及创建过程源码简要分析(一)
- Qemu-KVM虚拟机初始化及创建过程源码简要分析(二)
- KVM VCPU创建过程
- KVM vCPU创建过程
- 初始化过程
- 初始化过程
- Centos KVM 基本安装过程
- ubuntu16.04 装kvm过程
- Qemu创建KVM虚拟机内存初始化流程
- KVM 的安装过程(图文)
- QEMU和KVM 中断处理过程
- BM78 固件升级
- hdoj1869 六度分离(flody)
- Java volatile 关键之的理解
- Revit二次开发入门--创建一个简单的程序
- 详解Android动画之Frame Animation
- KVM初始化过程
- Android热更新之AndFix就是个大坑
- 安卓基础-------20160804
- 在PHP项目中使用Standford Moss
- 六度分离(HDU1869)
- IPMI协议
- 基于vlc的unity3d vr视频播放器开发,简述
- Unity-Dither4444的研究
- 自定义注解之编译时注解(RetentionPolicy.CLASS)(一)