Linux-KVM虚拟化源代码分析文档.doc
《Linux-KVM虚拟化源代码分析文档.doc》由会员分享,可在线阅读,更多相关《Linux-KVM虚拟化源代码分析文档.doc(19页珍藏版)》请在咨信网上搜索。
1、(word完整版)Linux KVM虚拟化源代码分析文档KVM虚拟机源代码分析1, KVM结构及工作原理1.1 KVM结构KVM基本结构有两部分组成。一个是KVM Driver ,已经成为Linux 内核的一个模块。负责虚拟机的创建,虚拟内存的分配,虚拟CPU寄存器的读写以及虚拟CPU的运行等.另外一个是稍微修改过的Qemu,用于模拟PC硬件的用户空间组件,提供I/O设备模型以及访问外设的途径。图1 KVM基本结构KVM基本结构如图1所示。其中KVM加入到标准的Linux内核中,被组织成Linux中标准的字符设备(/dev/kvm)。Qemu通KVM提供的LibKvm应用程序接口,通过ioct
2、l系统调用创建和运行虚拟机。KVM Driver使得整个Linux成为一个虚拟机监控器。并且在原有的Linux两种执行模式(内核模式和用户模式)的基础上,新增加了客户模式,客户模式拥有自己的内核模式和用户模式.在虚拟机运行下,三种模式的分工如下:客户模式:执行非I/O的客户代码.虚拟机运行在客户模式下。内核模式:实现到客户模式的切换。处理因为I/O或者其它指令引起的从客户模式的退出.KVM Driver工作在这种模式下.用户模式:代表客户执行I/O指令Qemu运行在这种模式下.在KVM模型中,每一个Guest OS 都作为一个标准的Linux进程,可以使用Linux的进程管理指令管理.在图1中
3、。/dev/kvm在内核中创建的标准字符设备,通过ioctl系统调用来访问内核虚拟机,进行虚拟机的创建和初始化;kvm_vm fd是创建的指向特定虚拟机实例的文件描述符,通过这个文件描述符对特定虚拟机进行访问控制;kvm_vcpu fd指向为虚拟机创建的虚拟处理器的文件描述符,通过该描述符使用ioctl系统调用设置和调度虚拟处理器的运行。1.2 KVM工作原理KVM的基本工作原理:用户模式的Qemu利用接口libkvm通过ioctl系统调用进入内核模式。KVM Driver为虚拟机创建虚拟内存和虚拟CPU后执行VMLAUCH指令进入客户模式。装载Guest OS执行.如果Guest OS发生外
4、部中断或者影子页表缺页之类的事件,暂停Guest OS的执行,退出客户模式进行一些必要的处理。然后重新进入客户模式,执行客户代码。如果发生I/O事件或者信号队列中有信号到达,就会进入用户模式处理。KVM采用全虚拟化技术。客户机不用修改就可以运行。图2 KVM 工作基本原理2 ,相关技术处理器管理和硬件辅助虚拟化技术Intel 在2006年发布了硬件虚拟化技术.其中支持X86体系结构的称为Intel VTx技术。ADM称为SVM技术。VT-x引入了一种新的处理器操作,叫做VMX(Virtual Machine Extension),提供了两种处理器的工作环境。VMCS结构实现两种环境之间的切换。
5、VM Entry使虚拟机进去客户模式,VM Exit使虚拟机退出客户模式。2.1 KVM中Guest OS的调度执行VMM调度Guest OS执行时,Qemu通过ioctl系统调用进入内核模式,在KVM Driver中通过get_cpu获得当前物理CPU的引用。之后将Guest状态从VMCS中读出.并装入物理CPU中。执行VMLAUCH指令使得物理处理器进入非根操作环境,运行客户代码.当Guest OS执行一些特权指令或者外部事件时,比如I/O访问,对控制寄存器的操作,MSR的读写数据包到达等.都会导致物理CPU发生VMExit,停止运行Guest OS.将Guest OS保存到VMCS中,H
6、ost状态装入物理处理器中,处理器进入根操作环境,KVM取得控制权,通过读取VMCS中VM_EXIT_REASON字段得到引起VM Exit的原因。从而调用kvm_exit_handler处理函数。如果由于I/O获得信号到达,则退出到用户模式的Qemu处理。处理完毕后,重新进入客户模式运行虚拟CPU。如果是因为外部中断,则在Lib KVM中做一些必要的处理,重新进入客户模式执行客户代码。2.2 KVM中内存管理KVM使用影子页表实现客户物理地址到主机物理地址的转换。初始为空,随着虚拟机页访问实效的增加,影子页表被逐渐建立起来,并随着客户机页表的更新而更新.在KVM中提供了一个哈希列表和哈希函数
7、,以客户机页表项中的虚拟页号和该页表项所在页表的级别作为键值,通过该键值查询,如不为空,则表示该对应的影子页表项中的物理页号已经存在并且所指向的影子页表已经生成.如为空,则需新生成一张影子页表,KVM将获取指向该影子页表的主机物理页号填充到相应的影子页表项的内容中,同时以客户机页表虚拟页号和表所在的级别生成键值,在代表该键值的哈希桶中填入主机物理页号,以备查询。但是一旦Guest OS中出现进程切换,会把整个影子页表全部删除重建,而刚被删掉的页表可能很快又被客户机使用,如果只更新相应的影子页表的表项,旧的影子页表就可以重用。因此在KVM中采用将影子页表中对应主机物理页的客户虚拟页写保护并且维护
8、一张影子页表的逆向映射表,即从主机物理地址到客户虚拟地址之间的转换表,这样VM对页表或页目录的修改就可以触发一个缺页异常,从而被KVM捕获,对客户页表或页目录项的修改就可以同样作用于影子页表,通过这种方式实现影子页表与客户机页表保持同步。2.3 KVM中设备管理一个机器只有一套I/o地址和设备.设备的管理和访问是操作系统中的突出问题、同样也是虚拟机实现的难题,另外还要提供虚拟设备供各个VM使用。在KVM中通过移植Qemu中的设备模型(Device Model)进行设备的管理和访问。操作系统中,软件使用可编程I/O(PIO)和内存映射I/O(MMIO)与硬件交互.而且硬件可以发出中断请求,由操作
9、系统处理.在有虚拟机的情况下,虚拟机必须要捕获并且模拟PIO和MMIO的请求,模拟虚拟硬件中断.捕获PIO:由硬件直接提供。当VM发出PIO指令时,导致VM Exit然后硬件会将VM Exit原因及对应的指令写入VMCS控制结构中,这样KVM就会模拟PIO指令。MMIO捕获:对MMIO页的访问导致缺页异常,被KVM捕获,通过X86模拟器模拟执行MMIO指令。KVM中的I/O虚拟化都是用户空间的Qemu实现的。所有PIO和MMIO的访问都是被转发到Qemu的。Qemu模拟硬件设备提供给虚拟机使用。KVM通过异步通知机制以及I/O指令的模拟来完成设备访问,这些通知包括:虚拟中断请求,信号驱动机制以
10、及VM间的通信。以虚拟机接收数据包来说明虚拟机和设备的交互。图3 I/O分析(1)当数据包到达主机的物理网卡后,调用物理网卡的驱动程序,在其中利用Linux内核中的软件网桥,实现数据的转发。(2)在软件网挢这一层,会判断数据包是发往那个设备的,同时调用网桥的发送函数,向对应的端口发送数据包。(3)若数据包是发往虚拟机的,则要通过tap设备进行转发,tap设备由两部分组成,网络设备和字符设备。网络设备负责接收和发送数据包,字符设备负责将数据包往内核空间和用户空间进行转发。Tap网络部分收到数据包后,将其设备文件符置位,同时向正在运行VM的进程发出I/O可用信号,引起VM Exit,停止VM运行,
11、进入根操作状态。KVM根据KVM_EXIT_REASON判断原因,模拟I/O指令的执行,将中断注入到VM的中断向量表中。(4)返回用户模式的Qemu中,执行设备模型。返回到kvm_main loop中,执行Kvmmain-loopwait,之后进入main_loop wait中,在这个函数里收集对应设备的设备文件描述符的状态,此时tap设备文件描述符的状态同样被集到fd set。(5)Kvm mainloop不停地循环,通过select系统调用判断哪螋文件描述符的状态发生变化,相应的调用对应的处理函数。对予tap来说,就会通过Qemu-send_packet将数据发往rtl8139一dorec
12、eiver,在这个函数中完成相当于硬件RTL8139网卡的逻辑操作。KVM通过模拟IO指令操作虚拟RTL8139将数据拷贝到用户地址空间,放在相应的IO地址。用户模式处理完毕后返回内核模式,而后进入客户模式,VM被再次执行,继续收发数据包。3,KVM 源代码分析虚拟机创建和运行流程代码分析3.1 KVM创建和运行虚拟机流程KVM虚拟机创建和运行虚拟机分为用户态和核心态两个部分,用户态主要提供应用程序接口,为虚拟机创建虚拟机上下文环境,在libkvm中提供访问内核字符设备/dev/kvm的接口;内核态为添加到内核中的字符设备/dev/kvm,模块加载进内核后即可进行接口用户空间调用创建虚拟机。在
13、创建虚拟机过程中,kvm字符设备主要为客户机创建kvm数据机构,创建该虚拟机的虚拟机文件描述符及其相应的数据结构以及创建虚拟处理器及其相应的数据结构。Kvm创建虚拟机的流程如图4所示。首先申明一个kvm_context_t 变量用以描述用户态虚拟机上下文信息,然后调用kvm_init()函数初始化虚拟机上下文信息;函数kvm_create()创建虚拟机实例,该函数通过ioctl系统调用创建虚拟机相关的内核数据结构并且返回虚拟机文件描述符给用户态kvm_context_t数据结构;创建完内核虚拟机数据结构后,再创建内核pit以及mmio等基本外设模拟设备,然后调用kvm_create_vcpu(
14、)函数来创建虚拟处理器,kvm_create_vcpu()函数通过ioctl()系统调用向由vm_fd文件描述符指向的虚拟文件调用创建虚拟处理器,并将虚拟处理器的文件描述符返回给用户态程序,用以以后的调度使用;创建完虚拟处理器后,由用户态的QEMU程序申请客户机用户空间,用以加载和运行客户机代码;为了使得客户虚拟机正确执行,必须要在内核中为客户机建立正确的内存映射关系,即影子页表信息。因此,申请客户机内存地址空间后,调用函数kvm_create_phys_mem()创建客户机内存映射关系,该函数主要通过ioctl系统调用向vm_fd指向的虚拟文件调用设置内核数据结构中客户机内存域相关信息,主要
15、建立影子页表信息;当创建好虚拟处理器和影子页表后,即可读取客户机到指定分配的空间中,然后调度虚拟处理器运行。调度虚拟机的函数为kvm_run(),该函数通过ioctl系统调用调用由虚拟处理器文件描述符指向的虚拟文件调度处理函数kvm_run()调度虚拟处理器的执行,该系统调用将虚拟处理器vcpu信息加载到物理处理器中,通过vm_entry执行进入客户机执行。在客户机正常运行期间kvm_run()函数不返回,只有发生以下两种情况时,函数返回:1,发生了I/O事件,如客户机发出读写I/O的指令;2,产生了客户机和内核KVM都无法处理的异常。I/O事件处理完毕后,通过重新调用KVM_RUN()函数继
16、续调度客户机的执行。图 4 KVM虚拟机创建流程3.2 虚拟机创建和运行主要函数分析1,函数kvm_init():该函数在用户态创建一个虚拟机上下文,用以在用户态保存基本的虚拟机信息,这个函数是创建虚拟机第一个需要调用的函数,函数返回一个kvm_context_t结构体.该函数原型为:Kvm_context_t kvm_init(struct kvm_callbacks callbacks,void opaque);参数:callbacks为结构体kvm_callbacks变量,该结构体包含指向函数的一组指针,用于在客户机执行过程中因为I/O事件退出到用户态的时候处理的回调函数(后面会分析)。
17、参数opaque一般未使用.函数执行基本过程:打开字符设备dev/kvm,申请虚拟机上下文变量kvm_context_t空间,初始化上下文的基本信息:设置fd文件描述符指向/dev/kvm、禁用虚拟机文件描述符vm_fd(1)设置I/O事件回调函数结构体,设置IRQ和PIT的标志位以及内存页面记录的标志位。主要相关数据结构:虚拟机上下文structkvm_context_t,用户态数据结构,用以描述虚拟机实例的用户态上下文信息。Struct kvm_context: 该结构体用于表示一个虚拟机上下文.主要包含的数据域为:Int fd :指向内核标准字符设备/dev/kvm的文件描述符。Int
18、vm_fd:指向所创建的内核虚拟机数据结构相关文件的文件描述符。Int vcpu_fdMAX_VCPUS:指向虚拟机所有的虚拟处理器的文件描述符数组。Struct kvm_run runMAX_VCPUS:指向虚拟机运行环境上下文的指针数组。Struct kvm_callbacks call_backs: 回调函数结构体指针,该结构体用于处理用户态I/O事件。Void opaque:指针(还未弄清楚)Int dirty_page_log_all:设置是否记录脏页面的标志。Int no_ira_creation: 用于设置是否再kernel里设置irq芯片。Int_irqchip_in_kern
19、el: 内核中irqchip的状态Int irqchip_inject_ioctl:用于拦截中断的iotcl系统调用Int no_pit_creation: 设置是否再内核中设置陷阱int pit_in_kernel:PIT状态int coalesced_mmio:kernel中mmiostruct kvm_irq_routing irq_routes:KVM中中断处理的路由结构指针。int nr_allocated_irq_routes:分配给该虚拟机的中断路由数目。int max_used_gsi:使用的最大的gsi(?)。用户态I/O处理函数结构体struct kvm_callbacks
20、,该结构体指向一组函数,主要用于处理客户机因为I/O事件退出而执行的过程。struct kvm_callbacks :该结构体用于在用户态中处理I/O事件,在KVM中调用KVM_QEMU实现.主要包含的数据域为:int (inb)(void opaque, uint16_t addr, uint8_t data):用于模拟客户机执行8位的inb指令。int (*inw)(void opaque, uint16_t addr, uint16_t *data):用于模拟客户机执行16位的inw指令。int (*inl)(void opaque, uint16_t addr, uint32_t da
21、ta):用于模拟客户机执行32位的inl指令。int (*outb)(void *opaque, uint16_t addr, uint8_t data):用于模拟客户机执行8位的outb指令。int (outw)(void opaque, uint16_t addr, uint16_t data):用于模拟客户机执行16位的outw指令.int (outl)(void opaque, uint16_t addr, uint32_t data):用于模拟客户机执行32位的outl指令.int (mmio_read)(void opaque, uint64_t addr, uint8_t dat
22、a,int len):用于模拟客户机执行mmio读指令。int (mmio_write)(void opaque, uint64_t addr, uint8_t data,int len):用于模拟客户机执行mmio写指令。int (*debug)(void *opaque, void *env, struct kvm_debug_exit_arch *arch_info):用户客户机调试的回调函数.int (*halt)(void *opaque, int vcpu):用于客户机执行halt指令的响应。int (shutdown)(void *opaque, void env):用于客户机执
23、行shutdown指令的响应。int (*io_window)(void *opaque):用于获得客户机io_windows。int (try_push_interrupts)(void opaque):用于注入中断的回调函数。void (push_nmi)(void opaque):用于注入nmi中断的函数。void (*post_kvm_run)(void *opaque, void *env);用户得到kvm运行状态函数.int (pre_kvm_run)(void opaque, void env);用于获得kvm之前运行状态的函数int (*tpr_access)(void opa
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- word 完整版 Linux KVM 虚拟 源代码 分析 文档
1、咨信平台为文档C2C交易模式,即用户上传的文档直接被用户下载,收益归上传人(含作者)所有;本站仅是提供信息存储空间和展示预览,仅对用户上传内容的表现方式做保护处理,对上载内容不做任何修改或编辑。所展示的作品文档包括内容和图片全部来源于网络用户和作者上传投稿,我们不确定上传用户享有完全著作权,根据《信息网络传播权保护条例》,如果侵犯了您的版权、权益或隐私,请联系我们,核实后会尽快下架及时删除,并可随时和客服了解处理情况,尊重保护知识产权我们共同努力。
2、文档的总页数、文档格式和文档大小以系统显示为准(内容中显示的页数不一定正确),网站客服只以系统显示的页数、文件格式、文档大小作为仲裁依据,平台无法对文档的真实性、完整性、权威性、准确性、专业性及其观点立场做任何保证或承诺,下载前须认真查看,确认无误后再购买,务必慎重购买;若有违法违纪将进行移交司法处理,若涉侵权平台将进行基本处罚并下架。
3、本站所有内容均由用户上传,付费前请自行鉴别,如您付费,意味着您已接受本站规则且自行承担风险,本站不进行额外附加服务,虚拟产品一经售出概不退款(未进行购买下载可退充值款),文档一经付费(服务费)、不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
4、如你看到网页展示的文档有www.zixin.com.cn水印,是因预览和防盗链等技术需要对页面进行转换压缩成图而已,我们并不对上传的文档进行任何编辑或修改,文档下载后都不会有水印标识(原文档上传前个别存留的除外),下载后原文更清晰;试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓;PPT和DOC文档可被视为“模板”,允许上传人保留章节、目录结构的情况下删减部份的内容;PDF文档不管是原文档转换或图片扫描而得,本站不作要求视为允许,下载前自行私信或留言给上传者【二***】。
5、本文档所展示的图片、画像、字体、音乐的版权可能需版权方额外授权,请谨慎使用;网站提供的党政主题相关内容(国旗、国徽、党徽--等)目的在于配合国家政策宣传,仅限个人学习分享使用,禁止用于任何广告和商用目的。
6、文档遇到问题,请及时私信或留言给本站上传会员【二***】,需本站解决可联系【 微信客服】、【 QQ客服】,若有其他问题请点击或扫码反馈【 服务填表】;文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“【 版权申诉】”(推荐),意见反馈和侵权处理邮箱:1219186828@qq.com;也可以拔打客服电话:4008-655-100;投诉/维权电话:4009-655-100。