《云计算虚拟化技术基础与实践》课件第七章 KVM内核模块解析.pptx
《《云计算虚拟化技术基础与实践》课件第七章 KVM内核模块解析.pptx》由会员分享,可在线阅读,更多相关《《云计算虚拟化技术基础与实践》课件第七章 KVM内核模块解析.pptx(36页珍藏版)》请在文库网上搜索。
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,为虚拟机
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 云计算虚拟化技术基础与实践 云计算虚拟化技术基础与实践课件第七章 KVM内核模块解析 计算 虚拟 技术 基础 实践 课件 第七 KVM 内核 模块 解析