go4321 发表于 2015-12-24 14:23:47

KVM和QEMU

====================================
目录
1 硬件虚拟化技术背景

2 KVM的内部实现概述
2.1 KVM的抽象对象
2.2 KVM的vcpu
2.3 KVM的IO虚拟化
2.3.1 IO的虚拟化
2.3.2 VirtIO

3 KVM-IO可能优化地方
3.1 Virt-IO的硬盘优化
3.2 普通设备的直接分配(Direct Assign)
3.3 普通设备的复用

===================================

1 硬件虚拟化技术背景

硬件虚拟化技术通过虚拟化指令集、MMU(Memory Map Unit)以及IO来运行不加修改的操作系统。

传统的处理器通过选择不同的运行(Ring 特权)模式,来选择指令集的范围,内存的寻址方式,中断发生方式等操作。在原有的Ring特权等级的基础上,处理器的硬件虚拟化技术带来了一个新的运行模式:Guest模式,来实现指令集的虚拟化。当切换到Guest模式时,处理器提供了先前完整的特权等级,让Guest操作系统可以不加修改的运行在物理的处理器上。Guest与Host模式的处理器上下文完全由硬件进行保存与切换。此时,虚拟机监视器(Virtual Machine Monitor)通过一个位于内存的数据结构(Intel称为VMCS, AMD称为VMCB)来控制Guest系统同Host系统的交互,以完成整个平台的虚拟化。

传统的操作系统通过硬件MMU完成虚拟地址到物理地址的映射。在虚拟化环境中,Guest的虚拟地址需要更多一层的转换,才能放到地址总线上:

Guest虚拟地址 -> Guest物理地址 -> Host物理地址
^               ^
|               |
MMU1            MMU2

其中MMU1可以由软件模拟(Shadow paging中的vTLB)或者硬件实现(Intel EPT、AMD NPT)。MMU2由硬件提供。

系统的IO虚拟化技术,通常是VMM捕捉Guest的IO请求,通过软件模拟的传统设备将其请求传递给物理设备。一些新的支持虚拟化技术的设备,通过硬件技术(如Intel VT-d),可以将其直接分配给Guest操作系统,避免软件开销。

X86处理器的生产厂商有自己的称谓,比如英特尔将Guest模式称为non-root operation,与之相对的是root operation,本文称为host模式。


2 KVM的内部实现概述

KVM是Linux内核的一个模块,基于硬件虚拟化技术实现VMM的功能。该模块的工作主要是通过操作与处理器共享的数据结构来实现指令集以及MMU的虚拟化,捕捉Guest的IO指令(包括Port IO和mmap IO)以及实现中断虚拟化。至于IO设备的软件模拟,是通过用户程序QEMU来实现的。QEMU负责解释IO指令流,并将其请求换成系统调用或者库函数传给Host操作系统,让Host上的驱动去完成真正的IO操作。她们之间的关系如下图所示:

+--------------+               +--------+   
| Qemu         |               |      |   
|            |               |      |               
| +---++----+|               | Guest|               
| |vHD||vNIC|||          ||
||drivers |exit_reason) {
...
case KVM_IO:
handle_io(vcpu);
break;
case KVM_MMIO:
handle_mmio(vcpu);
break;
...
}
}

该线程同Guest的vcpu紧密相连。如果我们把线程的执行看作Guest vcpu的一部分,那么从Host的角度来看,该vcpu在三种不同的上下文中运行:Host user/Host kernel/Guest,将运行于一个更大的循环当中。该vcpu的运行逻辑如下图:

Host user   |Host kernel| Guest mode   |
|               |            |
|               |            |
+->kvm_run(vcpu)-------+         |            |
|                |   v         |            |
|                | +->vm entry----------+       |   
|                | |             |      v       |
|                | |             |   Execute    |
|                | |             |   Natively   |
|                | |             |      |       |
|                | |vm exit| |                |
-------+   |   +-+                |
|      |               |
+------+   |   +-+                |
|Guest |---------->| |   +----------+ |
+------+   |   +-+   | Device   | |
|      |    | Scheduler| |
+------+   |   +-+   +----------+ |
|Guest |---------->| |-----+          |
+------+   |   +-+   |          |
|          +--v--------+ |
| Current--->+--+DM| |   +-----+
| Context| +--+------------->| NIC |
|          +-----------+ |   +-----+
|                        |

图 10

其中,Device Modle(DM)实现前文提到的remapping逻辑,Device Scheduler用于选择和切换设备上下文实现物理设备的复用。在普通设备直接分配的基础上,通过对现有普通设备的复用,将会带来廉价、灵活、高效的IO性能。与之相对的是,目前已经有支持SR-IOV的网卡,从硬件上实现复用功能,支持多个(静态,即最大数目是内置的)虚拟的PCI网卡设备,价格昂贵,且受到一个网口总带宽有限的限制(软件复用技术,可以复用多个网卡,进而提高系统总的带宽)。

参考:
1[代码] qemu-kvm. git://git.kernel.org/pub/scm/virt/kvm/qemu-kvm.git
2[代码] Linux-2.6{/virt/kvm/*, arch/x86/kvm/*, drivers/virtio/*, drivers/block/virtio_blk.c, drivers/vhost/*}
3[手册] Intel? Virtualization Technology for Directed I/O
4[手册] Intel? 64 and IA-32 Architectures Software Developer’s Manual 3B.
5[论文] Towards Virtual Passthrough I/O on Commodity Devices. 2008.
6[论文] kvm: the Linux Virtual Machine Monitor. 2007.
7[论文] virtio: Towards a De-Facto Standard For Virtual I/O Devices. 2008
8[论文] High Performance Network Virtualization with SR-IOV. 2010.
9[论文] QEMU, a Fast and Portable Dynamic Translator. 2005.
页: [1]
查看完整版本: KVM和QEMU