随笔- 4635  评论- 10  文章- 0 

KVM,QEMU核心分析

现在的问题是学习虚拟化软件KVM相关实施原则、处理,的源代码的分析总结,,若有不对的地方,希望大家提出。

因为有一些代码结构图或者是架构图上传比較麻烦。所以博文都放在了自己的个人博客上。麻烦大家移步查看:

总入口:我的个人bloghttp://www.royluo.org


文章列表(可直接点击进入)

1. kvm安装与启动过程说明

依据这段时间对Linux KVM的研究。现将KVM的安装与Virtual OS的启动进行总结说明。【点击查看完整文章】

 

2. kvm安装与启动过程说明-Kernel源代码编译方式

《kvm安装与启动过程说明》进行了通用桌面系统的虚拟机安装。

在本文中将介绍自行编译linux Kernel内核源代码,无桌面OS虚拟机安装和启动。为兴许内核调试打下基础。

【点击查看完整文章】


传统OS环境中,CPU对内存的訪问都必须通过MMU将虚拟地址VA转换为物理地址PA从而得到真正的Physical Memory Access,即:VA->MMU->PA

虚拟执行环境中因为Guest OS所使用的物理地址空间并非真正的物理内存,而是由VMM供其所使用一层虚拟的物理地址空间,为使MMU可以正确的转换虚实地址,Guest中的地址空间的转换和訪问都必须借助VMM来实现,这就是内存虚拟化的主要任务。即:GVA->MMU Virtualation->HPA【点击查看完整文章】


    

在嵌套虚拟环境(Nested Virtualization)下,执行在hypervisor上的Virtual Machine仍能够作为hypervisor去执行其他的Virutal Machine,而KVM也支持了这样的强大的特性。而在《KVM硬件辅助虚拟化之 EPT》一文中,我们具体分析了单层虚拟机并引入硬件辅助虚拟化EPT功能的环境下,Guest OS中的虚拟地址到真实物理地址的訪问方法,即在EPT页表的帮助下,通过二维的页表机制。终于实现GVA到HPA的转换。那么在多层嵌套虚拟机情况下,EPT又是怎样发挥作用的呢?【点击查看完整文章】



相信非常多的人对虚拟机并不陌生。眼下也有非常多优秀的虚拟机软件,比如:VMware, VirtualBox, Xen, KVM等。

而本文的主要内容是介绍KVM。【点击查看完整文章】


在前文中,介绍了在KVM环境下使用Qemu成功创建并执行了虚拟机。而这一切的背后是什么样的运作机制呢?本文主要介绍在整个创建和执行过程中Qemu与KVM里两者的核心执行流程。

【点击查看完整文章】


在“KVM Run Process之Qemu核心流程”一文中讲到Qemu通过KVM_RUN调用KVM提供的API发起KVM的启动,从这里进入到了内核空间执行,本文主要讲述内核中KVM关于VM执行的核心调用流程,所使用的内核版本号为linux3.15。【点击查看完整文章】
    
KVM在I/O虚拟化方面,传统的方式是使用Qemu纯软件的方式来模拟I/O设备,当中包含常常使用的网卡设备。这次我们重点分析Qemu为实现网络设备虚拟化的全虚拟化方案。本主题从三个组成方面来完整描写叙述,包含:1. 前端网络流的建立; 2. 虚拟网卡的创建; 3. 网络I/O虚拟化 in Guest OS。
本篇主要讲述“前端网络流的建立”。

【点击查看完整文章】


上文针对Qemu在前端网络流路径的建立方面做了具体的描写叙述,数据包从Host的物理网卡经过Host Linux内核中的Bridge, 经过Tap设备到达了Qemu的用户态空间。而Qemu是怎样把数据包送进Guest中的呢。这里必定要说到到虚拟网卡的建立。

当命令行传入nic相关參数时,Qemu就会解析网络相关的參数后进入虚拟网卡的创建流程。而在上文中提到对于全部-net类型的设备。都视作一个net client来对待。而在net client的建立之前,须要先创建Qemu内部的hub和相应的port,来关联每个net client,而对于每个创建的-net类型的设备都是能够能够配置其接口的vlan号。从而控制数据包在当中配置的vlan内部进行转发,从而做到多个虚拟设备之间的switch。【点击查看完整文章】



前面两文主要对前端网络流的数据路径和虚拟网卡的创建进行了说明,这些能够看做是Guest OS网络数据包收发的准备工作,那么网络数据包是怎样在Guest OS中进进出出的呢,本文就是重点讲述Guest OS的数据包的收发路径。当中涉及到一个重要的虚拟化技术。即I/O虚拟化.【点击查看完整文章】

在Linux中。大家应该对syscall很的了解和熟悉,其是用户态进入内核态的一种途径或者说是一种方式,完毕了两个模式之间的切换。而在虚拟环境中,有没有一种类似于syscall这样的方式,可以从no root模式切换到root模式呢?答案是肯定的,KVM提供了Hypercall机制。x86体系架构也有相关的指令支持。【点击查看完整文章】

Linux眼下支持至少了8种虚拟化系统:  
1. Xen
2. KVM
3. VMware's VMI
4. IBM's System p
5. IBM's System z
6. User Mode Linux
7. lguest 
8. IBM's legacy iSeries
而新的系统也在不断的涌现。各个系统在网络设备、块设备、console及其他设备驱动在新特性支持和性能优化方面存在着瓶颈。
为解决这些问题,Rusty Russell开发了virtio机制,其是一个在hypervisor之上的抽象API接口,让客户机知道自己执行在虚拟化环境中。从而与hypervisor依据virtio标准协作,从而在Guest中达到更好的性能(特别是I/O性能),关于virtio在其论文中如此定义:【点击查看完整文章】

Qemu为virtio设备分配了专门的pci设备ID。device IDs (vendor ID 0x1AF4) from 0x1000 through 0x10FF,而pci子系统中的厂商ID和设备ID就成为了virtio类型和厂商域的组成。所以PCI驱动是不须要知道virtio设备类型的真正含义,对于Kernel来说仅仅是注冊了一个struct virtio_device,并挂载到了virtio bus类型总线上,并由virtio driver来驱动。
virtio设备对于Linux Kernel中的设备类型来说是作为pci设备被使用的,因此具有pci设备的全部属性,所以其也具备了PCI配置空间。【点击查看完整文章】


KVM上设备I/O虚拟化的性能问题长期存在,此时由Rusty Russell开发的virtio引起了开发人员们的注意并逐渐被KVM等虚拟化平台接纳并作为了其I/O虚拟化最基本的一个通用框架。

Virtio使用virtqueue来实现其I/O机制,每一个virtqueue就是一个承载大量数据的queue。

vring是virtqueue的详细实现方式。【点击查看完整文章】


在前面几文中已经大体介绍了virtio的重要组成。包含virtio net设备的创建,vring的创建,与virtio设备的交互方式,我们就从网络数据包的发送角度来看下virtio的详细使用流程。

【点击查看完整文章】


在前面的文章中在介绍virtio机制中,能够看到在通常的应用中一般使用QEMU用户态程序来模拟I/O訪问。而Guest中的数据要通过Guest到Host Userspace的第一次拷贝。再经过Host userspace的第二次拷贝,这样的多次的数据拷贝和CPU特权级的切换对性能有相当大的影响。为加速virtio设备的I/O性能,VHOST通过driver的形式在Host Kernel中直接实现了virtio设备的模拟。通过在Host Kernel中对virtios设备的模拟执行同意Guest与Host Kernel直接进行数据交换,从而避免了用户空间的system call与数据拷贝的性能消耗。【点击查看完整文章】

17. Virtio-blk浅析
和virtio-network一样,virtio-blk驱动使用Virtio机制为Guest提供了一个高性能的块设备I/O的方法。我们这里看下virtio-blk的实现。【点击查看完整文章】




待续。。

posted on 2015-12-14 11:58 gcczhongduan 阅读(...) 评论(...) 编辑 收藏