如何在kvm中完成设备仿真

时间:2010-06-26 18:23:27

标签: linux linux-kernel kvm qemu

我知道qemu-kvm在KVM中执行设备模拟。 qemu-kvm是否在主机的用户空间中执行?因此,当遇到kick函数时,它会通过超级调用退出VM进入虚拟机管理程序,然后管理程序移交给 主机用户空间中的qemu-kvm。在做完所需之后 事情,qemu-kvm转移到管理程序,然后转移到管理程序 管理程序回到VM。所以这意味着有两个系统调用之一 来自VM - > Hypervisor和qemu-kvm - > Hypervisor?这些是步骤吗? 那发生或我错了?如果有任何文档 这些东西,请给我链接。非常感谢你......

谢谢, 巴拉

4 个答案:

答案 0 :(得分:2)

kvm由一家名为qumranet的以色列公司发起。这些介绍性论文由这些人撰写,建议阅读:

基于内核的虚拟机技术:http://www.fujitsu.com/downloads/MAG/vol47-3/paper18.pdf KVM:基于内核的虚拟化驱动程序:http://www.linuxinsight.com/files/kvm_whitepaper.pdf

KVM使用QEMU进行I / O仿真,本文对此进行了解释。 它将帮助您了解从guest虚拟机到主机模式的切换是如何工作的,切换背后的原因,qemu在用户空间如何完成I / O仿真以及如何切换回guest虚拟机。这些都是优秀的简短论文。

答案 1 :(得分:2)

我更熟悉从事x86架构的KVM部分,所以试着在KVM的x86实现中解释一下。

在x86架构中,KVM利用CPU的功能来分离虚拟机管理程序和访客模式。在英特尔术语中,它们分别是VMX根模式和非根模式。

VM条目(管理程序 - > VM)由KVM使用VMLAUNCH指令触发,所有客户需要的信息在内核模式下填充在CPU的VMCS中。只从qemu-kvm调用系统调用到kvm内核模块。

当guest虚拟机操作系统处理超出其权限的内容(例如访问物理硬件或发生中断)时,会发生VM退出。之后,发出VM条目,CPU再次更改为非root模式以执行访客代码。总之,VM退出(VM - >管理程序)由HW自动完成,相应的退出原因和信息将在VMCS中进行记录。然后KVM检查VMCS以确定其下一步。 VM没有系统调用 - >管理程序。

大多数设备模拟都基于用户空间,qemu-kvm可以利用现有的qemu代码。但是,某些设备直通技术(如Intel VT-d)允许访客通过IOMMU或其他方式直接访问硬件。这可以带来更强大的性能,特别是在高速网络设备上。

如果您想挖掘源代码,我建议首先关注CPU虚拟化(Intel VT-x),它位于linux/arch/x86/kvm/vmx.c。英特尔软件开发人员指南也全面介绍了VT。

答案 2 :(得分:1)

我发现this很好。至少基础知识。希望它有所帮助。

答案 3 :(得分:0)

qemu-kvm是否在主机的用户空间中执行?是的,这也是一个性能瓶颈,并且有很多方法可以开发它。查看用于网络的PCI SR-IOV NIC和用于fibrechannel的NPIV。它们都是专门用于细分I / O控制器的硬件,因此KVM / qemu可以将VM连接到控制器上的专用通道。

所以这意味着有两个来自VM的系统调用 - > Hypervisor和qemu-kvm - > Hypervisor?我不确定,但我认为有设备中断跨越用户内核空间边界而不是系统调用。

也许这份文件会对你有所帮助:

http://www.linux-kvm.org/wiki/images/4/42/Kvm-device-assignment.pdf