文库网
ImageVerifierCode 换一换
首页 文库网 > 资源分类 > PPTX文档下载
分享到微信 分享到微博 分享到QQ空间

《云计算虚拟化技术基础与实践》课件第七章 KVM内核模块解析.pptx

  • 资源ID:21763132       资源大小:1.29MB        全文页数:36页
  • 资源格式: PPTX        下载积分:15文币
微信登录下载
快捷下载 游客一键下载
账号登录下载
三方登录下载: QQ登录 微博登录
二维码
扫码关注公众号登录
下载资源需要15文币
邮箱/手机:
温馨提示:
快捷下载时,用户名和密码都是您填写的邮箱或者手机号,方便查询和重复下载(系统自动生成)。
如填写123,账号就是123,密码也是123。
支付方式: 支付宝    微信支付   
验证码:   换一换

加入VIP,免费下载
 
账号:
密码:
验证码:   换一换
  忘记密码?
    
友情提示
2、PDF文件下载后,可能会被浏览器默认打开,此种情况可以点击浏览器菜单,保存网页到桌面,就可以正常下载了。
3、本站不支持迅雷下载,请使用电脑自带的IE浏览器,或者360浏览器、谷歌浏览器下载即可。
4、本站资源下载后的文档和图纸-无水印,预览文档经过压缩,下载后原文更清晰。
5、试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓。

《云计算虚拟化技术基础与实践》课件第七章 KVM内核模块解析.pptx

1、本章重点1.了解KVM内核模块的组成。2.熟悉KVM涉及的内核源码结构。3.熟悉KVM API中的常用结构体。4.掌握System ioctl、VM ioctl和vCPU ioctl调用。5.熟悉KVM内核中的数据结构。6.理解KVM内核中的初始化流程、虚拟机创建流程。KVM内核模块概述1.KVM模块架构2.Makefile文件分析3.KVM内核源码结构0 1KVM内核模块概述KVM(Kernel-based Virtual Machine的缩写,即基于内核的虚拟机),是一种用于Linux内核中的虚拟化基础设施,可以将Linux内核转化为一个Hypervisor。KVM在2007年2月被导入L

2、inux2.6.20内核版本中,以可加载内核模块的方式被移植到FreeBSD和Illumos上。KVM是基于x86架构且支持硬件虚拟化技术(如Intel VT或AMD-V)的Linux全虚拟化解决方案。KVM包含一个为处理器提供底层虚拟化的可加载的核心模块kvm.ko(Intel处理器的kvm-intel.ko或AMD处理器的kvm-amd.ko)。KVM能在不改变Linux或Windows镜像的情况下同时运行多个虚拟机,即多个虚拟机使用同一镜像,并为每一个虚拟机配置个性化硬件环境,包括网卡、磁盘、图形适配器、处理器等。KVM需要一个经过修改的QEMU软件作为虚拟机上层控制和应用界面。1.KV

3、M模块架构KVM的代码部署在宿主机上,用户空间对应的是QEMU,内核空间对应的是KVM Driver。KVM Driver负责模拟虚拟机的CPU运行,内存管理,设备管理等,QEMU模拟虚拟机的I/O设备接口以及用户态控制接口。KVM模块架构图2.Makefile文件分析KVM内核模块从Linux 2.6.20版本开始已经被收入到内核树中,在源码中涉及KVM的主要有两个目录,virt和arch/x86/kvm。virt目录主要包含内核中非硬件体系架构相关的部分如IOMMU、中断控制等。其他的主要都包含在arch/x86/kvm目录。按照分析Linux Kernel代码的惯例,Makefile和K

4、config是理解源代码结构最好的地图。打开Kconfig可以看到,里面提供了3个主要的菜单选项:KVM、KVM-INTEL、KVM-AMD,KVM选项是KVM的开关,而KVM-XXX选项对应目前两大CPU厂商INTEL和AMD。2.Makefile文件分析内核代码中$(CONFIG_KVM)部分是预编译条件。在最后三行,可以看到该Makefile主要由三个模块生成:kvm.ko、kvm-intel.ko和 kvm-amd.ko,前 者 是KVM的核心模块,后两者是KVM的平台架构独立模块。EXTRA_CFLAGS+=-Ivirt/kvm-Iarch/x86/kvm CFLAGS_x86.o:

5、=-I.CFLAGS_svm.o:=-I.CFLAGS_vmx.o:=-I.kvm-y+=$(addprefix./././virt/kvm/,kvm_main.o ioapic.o coalesced_mmio.o irq_comm.o eventfd.o assigned-dev.o)kvm-$(CONFIG_IOMMU_API)+=$(addprefix./././virt/kvm/,iommu.o)kvm-y+=x86.o mmu.o emulate.o i8259.o irq.o lapic.o i8254.o timer.o kvm-intel-y+=vmx.okvm-amd-y+

6、=svm.oobj-$(CONFIG_KVM)+=kvm.oobj-$(CONFIG_KVM_INTEL)+=kvm-intel.oobj-$(CONFIG_KVM_AMD)+=kvm-amd.o3.KVM内核源码结构KVM工作原理KVM内核模块KVM虚拟机调度执行VMM调度虚拟机(Guest OS)执行时,QEMU通过IOCTL系统调用进入内核模式,在KVM Driver中通过get_cpu获得对当前物理CPU的引用。KVM内存管理KVM使用影子页表实现客户物理地址到宿主机物理地址的转换。KVM设备管理KVM中的I/O虚拟化都是通过用户空间的QEMU实现的。而所有PIO和MMIO的访问都是被

7、转发到QEMU的。3.KVM内核源码结构KVM I/O模型1)当数据包到达主机的物理网卡后,利用Linux内核中的软件网桥,实现数据的转发。2)在软件网桥判断数据包是发往那个设备的,调用发送函数,发送数据包。3)若数据包是发往虚拟机的,则要通过tap设备进行转发,tap设备由两部分组成,网络设备和字符设备。网络设备负责接收和发送数据包,字符设备负责将数据包往内核空间和用户空间进行转发。4)转到用户模式的QEMU中,执行设备模型。执行完毕返回到KVM main_loop中,执行KVM main_loop_wait,在这个函数里收集对应设备的设备文件描述符的状态。5)KVM中的main_loop不

8、停地循环,相应地调用对应的处理函数。KVM API1.KVM API概述2.KVM API的结构体3.System ioctl调用4.VM ioctl调用5.VCPU ioctl调用0 21.KVM API概述KVM API是一组IOCTL指令的集合,主要功能是为了控制虚拟机的整个生命周期。KVM所提供的用户空间API从功能上划分,可以分为以下三种类型:API类型型功能功能说明明System指令主要是针对虚拟机的全局性参数进行查询和设置以及用于虚拟机创建等控制操作。VM指令主要是针对可以影响具体VM虚拟机的属性进行查询和设置,比如内存大小设置、创建vcpu等。注意:VM指令不是进程安全的。VC

9、PU指令主要针对具体的vCPU进行参数设置,比如MRU寄存器读写、中断控制等。1.KVM API概述KVM API是通过一个字符设备进行访问的。这个字符设备在Linux系统的/dev目录下,设备名是kvm,在/dev目录下敲入ls l kvm可以看到关于kvm字符设备的一些详细信息。/dev/kvm作为Linux系统的一个标准字符型设备,可以使用常见的系统调用如open、close、ioctl等指令进行操作。ioctl配合特定的控制命令告诉kvm字符设备进行特定的操作,比如,KVM_CREATE_VM指令字表示创建一个虚拟机,同时会返回此虚拟机对应的fd文件描述符。利用此fd文件描述符可以执行

10、VM指令,对具体的虚拟机进行控制。2.KVM API的结构体KVM API包含符合Linux标准的一系列结构体,主要是kvm_device_fops、kvm_vm_fops、kvm_vcpu_fops,分别对应字符型设备、VM文件描述符和vCPU文件描述符的三种操作,结构体都是标准file_operations结构体。结构体类型file_operations在头文件linux/fs.h中定义,用来存储驱动内核模块提供的对设备进行各种操作的函数指针。kvm_device_fops为一个标准的file_operations结构体,但是只包含了ioctl函数,而read、open、write等常见的

11、系统调用均采用默认实现。static const struct file_operations kvm_device_fops=.unlocked_ioctl=kvm_device_ioctl,#ifdef CONFIG_COMPAT.ioctl=kvm_device_ioctl,#endif.release=kvm_device_release,;2.KVM API的结构体在调用kvm_create_vm之后,创建了一个匿名inode,对应的fop为kvm_vm_fops结构体。在QEMU中,通过ioctl调用/dev/kvm的接口,返回该inode的文件描述符,之后对该VM的操作全部通过该

12、文件描述符进行,kvm_vm_fops结构体定义在virt/kvm/kvm_main.c中。static struct file_operations kvm_vm_fops=.release=kvm_vm_release,.unlocked_ioctl=kvm_vm_ioctl,#ifdef CONFIG_COMPAT.compat_ioctl=kvm_vm_compat_ioctl,#endif.llseek=noop_llseek,;2.KVM API的结构体创建完VM,对于虚拟机的每个vCPU,QEMU都会为其创建一个线程,在其中调用kvm_vm_ioctl中的KVM_CREATE_V

13、CPU操作创建vCPU,通过创建一个名为“kvm-vcpu”的匿 名 inode并 返 回 其 描 述 符。之 后 对 每 个 vCPU的 操 作 都 通 过 该 文 件 描 述 符 进 行。kvm_vcpu_fops定义在virt/kvm/kvm_main中。static struct file_operations kvm_vcpu_fops=.release=kvm_vcpu_release,.unlocked_ioctl=kvm_vcpu_ioctl,#ifdef CONFIG_COMPAT.compat_ioctl=kvm_vcpu_compat_ioctl,#endif.mmap=

14、kvm_vcpu_mmap,.llseek=noop_llseek,;3.System ioctl调用ioctl是设备驱动程序中对设备的I/O通道进行管理的函数。int ioctl(int fd,ind cmd,);其中fd是用户程序使用open函数打开设备时返回的文件标示符,cmd是用户程序对设备的控制命令,后面的省略号是一些补充参数,一般最多一个,这个参数的有无和cmd的意义相关。KVM API提供的System ioctl系统调用是用于控制KVM运行环节的参数,包括全局性的参数设置和虚拟机创建等工作,主要的指令字包括:KVM_CREATE_VM:创建KVM虚拟机。KVM_CREATE_V

15、M:通过该指令字,KVM将返回虚拟机对应的一个文件描述符,文件描述符指向内核空间中一个新的虚拟机。全新创建的虚拟机没有vCPU,也没有内存,需要通过后续的ioctl指令进行配置。KVM_GET_VCPU_MMAP_SIZE:返回vCPU mmap区域的大小。4.VM ioctl调用VM ioctl指令实现对虚拟机的控制,大多需要从KVM_CREATE_VM中返回的fd来进行操作,具体操作包括:配置内存、配置vCPU、运行虚拟机等,主要指令如下:KVM_CREATE_VCPU为虚拟机创建vCPU。KVM_RUN根据kvm_run结构体信息,运行VM虚拟机。KVM_CREATE_VCPU,为虚拟机

16、创建vCPU,获得对应的fd描述符后,可以对其调用KVM_RUN,以启动该虚拟机(或称为调度vCPU)。4.VM ioctl调用kvm_run结构体定义在include/linux/kvm.h中,可以通过该结构体了解KVM的内部运行状态,主要的字段及说明如下表所示:字段名字段名功能功能说明明request_interrupt_window往vCPU中发出一个中断插入请求,让vCPU做好相关的准备工作ready_for_interrupt_injection响应request_interrupt_windows中的中断请求,当此位有效时,说明可以进行中断if_flag中断标识,如果使用了APIC

17、,则不起作用hardware_exit_reason当vCPU因为各种不明原因退出时,该字段保存了失败的描述信息(硬件失效)io该字段为一个结构体,当KVM产生硬件出错的原因是因为I/O输出时(KVM_EXIT_IO),该结构体将保存导致出错的I/O请求的数据mmio该字段为一个结构体。当KVM产生出错的原因是因为内存I/O映射导致的(KVM_ EXIT_MMIO),该结构体中将保存导致出错的内存I/O映射请求的数据5.vCPU ioctl调用vCPU ioctl系统调用主要针对具体的每一个虚拟机的vCPU进行配置,包括寄存器读/写、中断设置、内存设置、调试开关、时钟管理等功能,能够对KVM的

18、虚拟机进行精确的运行时配置。vCPU ioctl系统调用在寄存器控制方面提供了丰富的指令字,如下表所示。指令字指令字功能功能说明明KVM_GET_REGS获取通用寄存器信息KVM_SET_REGS设置通用寄存器信息KVM_GET_SREGS获取特殊寄存器信息KVM_SET_SREGS设置特殊寄存器信息KVM_GET_MSRS获取MSR寄存器信息KVM_SET_MSRS设置MSR寄存器信息KVM_GET_FPU获取浮点寄存器信息KVM_SET_FPU设置浮点寄存器信息KVM_GET_XSAVE获取vCPU的xsave寄存器信息KVM_SET_XSAVE设置vCPU的xsave寄存器信息KVM_G

19、ET_XCRS获取vCPU的xcr寄存器信息KVM_SET_XCRS设置vCPU的xcr寄存器信息KVM内核模块数据结构1.kvm结构体2.kvm_vcpu结构体3.kvm_x86_ops结构体0 31.kvm结构体对虚拟机来说,kvm结构体是关键,一个虚拟机对应一个kvm结构体,虚拟机的创建过程实质为kvm结构体的创建和初始化过程。用户态ioctl(fd,KVM_CREATE_VM,)-内核态kvm_dev_ioctl()kvm_dev_ioctl_create_vm()kvm_create_vm()/实现虚拟机创建的主要函数 kvm_arch_alloc_vm()/为kvm结构体分配空间

20、kvm_arch_init_vm()/初始化kvm结构中的架构相关部分,比如中断等 hardware_enable_all()/开启硬件、架构的相关操作 hardware_enable_nolock()kvm_arch_hardware_enable()kvm_x86_ops-hardware_enable()kzalloc()/分配memslots结构,并初始化为0 kvm_init_memslots_id()/初始化内存槽位(slot)的id信息 kvm_eventfd_init()/初始化事件通道 kvm_init_mmu_notifier()/初始化mmu操作的通知链 list_add

21、(&kvm-vm_list,&vm_list)/将新创建的虚拟机的kvm结构,加入到全局链表vm_list中1.kvm结构体在kvm结构体中,连接了如下几个重要的结构体成员,它们对虚拟机的运行有重要的作用:struct kvm_memslots*memslots:KVM虚拟机所分配到的内存slot,以数组形式存储这些slot的地址信息。struct kvm_vcpu*vcpusKVM_MAX_VCPUS:KVM虚拟机中包含的vCPU结构体,一个虚拟CPU对应一个vCPU结构体。struct kvm_io_bus*busesKVM_NR_BUSES:KVM虚拟机中的I/O总线,一条总线对应一个k

22、vm_io_bus结构体,如ISA总线、PCI总线。struct kvm_vm_stat stat:KVM虚拟机中的页表、MMU等运行时状态信息。struct kvm_arch arch:KVM的软件架构方面所需要的一些参数2.kvm_vcpu结构体在用户通过KVM_CREATE_VCPU系统调用请求创建vCPU之后,KVM子模块将创建kvm_vcpu结构体并进行相应的初始化操作,然后返回对应的vcpu_fd描述符。kvm_vcpu结构体中的字段较多,其中重要的成员如下:int vcpu_id:对应vCPU的ID。struct kvm_vcpu_arch arch:存储有KVM虚拟机的运行时参

23、数,如定时器、中断、内存槽等方面的信息。struct kvm_run*run:vCPU的运行时参数,其中保存了寄存器信息、内存信息、虚拟机状态等各种动态信息。2.kvm_vcpu结构体在KVM虚拟化环境中,硬件虚拟化使用vCPU描述符来描述虚拟CPU,vCPU描述符与操作系统中进程描述符类似,本质是一个结构体kvm_vcpu,其中包含如下信息:vCPU标识信息,如vCPU的ID号,vCPU属于哪个虚拟机等。虚拟寄存器信息,在VT-x的环境中,这些信息包含在VMCS中。vCPU状态信息,表示vCPU当前所处的状态(睡眠、运行等),主要供调度器使用。额外的寄存器/部件信息,主要指未包含在VMCS中

24、的寄存器或CPU部件。其他信息,用户VMM进行优化或存储额外信息的字段,如存放该vCPU私有数据的指针。2.kvm_vcpu结构体当VMM创建虚拟机时,首先要为虚拟机创建vCPU,整个虚拟机的运行实际上可以看作VMM调度不同的vCPU运行。虚拟机的vCPU通过VM IOCTL指令KVM_CREATE_VCPU实现,实质为创建kvm_vcpu结构体,并进行相关初始化。kvm_vm_ioctl()/kvm ioctl vm指令入口kvm_vm_ioctl_create_vcpu()/为虚拟机创建vCPU的ioctl调用的入口函数/创建vcpu架构,对于intel x86来说,最终调用vmx_cre

25、ate_vcpukvm_arch_vcpu_create()kvm_arch_vcpu_setup()/设置vcpu结构/为新创建的vcpu创建对应的fd,以便于后续通过该fd进行ioctl操作create_vcpu_fd()/架构相关的善后工作,比如再次调用vcpu_load,以/及tsc相关处理kvm_arch_vcpu_postcreate()3.kvm_x86_ops结构体kvm_x86_ops结构体中包含了针对具体的CPU架构进行虚拟化时的函数指针调用,其定义在Linux内核文件的arch/x86/include/asm/kvm_host.h中。该结构体主要包含以下几种类型的操作:C

26、PU VMM状态硬件初始化vCPU创建与管理中断管理寄存器管理时钟管理kvm_x86_ops结构体中的所有成员都是函数指针,在kvm-intel.ko和kvm-amd.ko这两个不同的模块中,针对各自的体系提供了不同的函数。在KVM的初始化过程和后续的运行过程中,KVM代码将通过该结构体的函数进行实际的硬件操作。KVM内核模块执行流程1.初始化流程2.虚拟机创建流程3.CPU虚拟化流程4.内存虚拟化流程5.客户机异常处理流程0 4KVM内核模块执行流程KVM将虚拟机所在的运行模式称为Guest模式,实际上指的是VMX的非根模式,而内核模块的重要流程都在对应根模式下。KVM重要工作流程图1.初始

27、化流程KVM模块分为三个主要模块:kvm.ko、kvm-intel.ko和kvm-amd.ko,这三个模块在初始化阶段的流程如图:KVM模块初始化流程1.初始化流程KVM的初始化步骤分为以下三步:1.在平台相关的KVM模块中通过module_init宏正式进入KVM的初始化阶段,并且执行相关的硬件初始化准备。2.进入kvm_main.c中的kvm_init函数进行正式的初始化工作,期间进行了一系列子操作。3.进行后续的硬件初始化准备操作。KVM初始化执行流程2.虚拟机创建流程在创建虚拟机过程中,kvm字符设备主要为客户机创建kvm数据结构,创建虚拟机文件描述符及其相应的数据结构,创建虚拟处理器

28、及其相应的数据结构。KVM创建虚拟机的流程图2.虚拟机创建流程虚拟机创建过程涉及的相关函数:1.函数kvm_init():该函数在用户态创建一个虚拟机上下文,用以在用户态保存基本的虚拟机信息,这个函数是创建虚拟机第一个需要调用的函数,函数返回一个kvm_context_t结构体。2.函数kvm_create():该函数主要用于创建一个虚拟机内核环境。3.函数kvm_create_vcpu():用于创建虚拟处理器。4.函数kvm_create_phys_mem()用于创建虚拟机内存空间。5.函数kvm_run():用于调度运行虚拟处理器。3.CPU虚拟化流程VMCS寄存器:VMCS保存虚拟机的相

29、关CPU状态,每个vCPU都有一个VMCS,每个物理CPU都有VMCS对应的寄存器。VM-Entry/VM-ExitVM-Entry是从根模式切换到非根模式,即从VMM切换到虚拟机,这个状态由VMM发起。VM-Exit是CPU从非根模式切换到根模式,即从虚拟机切换到VMM的操作。KVM_CREATE_VM创建VM的流程中,kvm_dev_ioctl_create_vm函数是主要函数。在kvm_dev_ioctl_create_vm中,有两个函数kvm_arch_init_vm和hardware_enable_all。KVM_CREATE_VCPUkvm_vm_ioctl_create_vcpu

30、主要有三部分,kvm_arch_vcpu_create,kvm_arch_vcpu_setup和kvm_arch_vcpu_postcreate,重点是kvm_arch_vcpu_create。4.内存虚拟化流程在虚拟机的创建与运行中pc_init_pci负责在QEMU中初始化虚拟机,内存初始化也是在这里完成的。在vl.c的main函数中有ram_size参数,由QEMU入参标识QEMU_OPTION_m设定,顾名思义就是虚拟机内存的大小,通过machine-init逐步传递给pc_init1函数。分出above_4g_mem_size和below_4g_mem_size,即高低端内存(也不一

31、定是32bit机器),然后开始初始化内存,即pc_memory_init,内存通过memory_region_init_ram下面的qemu_ram_alloc分配。5.客户机异常处理流程KVM保证客户机正确执行的基本手段,就是当客户机执行I/O指令或者其它特权指令时,引发处理器异常,从而陷入到根操作模式,由KVM Driver模拟执行。可以说,虚拟化保证客户机正确执行的基本手段就是异常处理机制。由于KVM采取了硬件辅助虚拟化技术,因此,和异常处理机制相关的一个重要的数据结构就是虚拟机控制结构VMCS。VMCS控制结构分为三个部分,一个是版本信息,一个是中止标识符,最后一个是VMCS数据域。VMCS数据域包含了六类信息:客户机状态域,宿主机状态域,VM-Entry控制域,VM-Execution控制域,VM-Exit控制域以及VM-Exit信息域。VM-Execution控制域可以设置可选的标志位,使客户机可以引发一定的异常指令。宿主机状态域,则保存了基本的寄存器信息,异常处理程序根据VM-Exit信息域来判断客户机异常的根本原因,选择正确的处理逻辑来进行处理。谢谢!


注意事项

本文(《云计算虚拟化技术基础与实践》课件第七章 KVM内核模块解析.pptx)为本站会员(bubibi)主动上传,文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知文库网(点击联系客服),我们立即给予删除!




关于我们 - 网站声明 - 网站地图 - 资源地图 - 友情链接 - 网站客服 - 联系我们

文库网用户QQ群:731843829  微博官方号:文库网官方   知乎号:文库网

Copyright© 2025 文库网 wenkunet.com 网站版权所有世界地图

经营许可证编号:粤ICP备2021046453号   营业执照商标

1.png 2.png 3.png 4.png 5.png 6.png 7.png 8.png 9.png 10.png