【问题标题】:How is device emulation done in kvmkvm中的设备仿真是如何完成的
【发布时间】:2010-06-26 18:23:27
【问题描述】:

我知道 qemu-kvm 在 KVM 中进行设备仿真。 qemu-kvm 是否在主机的用户空间中执行?因此,当遇到 kick 函数时,它会通过对 hypervisor 的 hypercall 退出 VM,然后 hypervisor 移交给 主机用户空间中的 qemu-kvm。接下来做需要的 事情,qemu-kvm 传输到管理程序,然后 管理程序返回给虚拟机。所以这意味着有两个系统调用一个 从 VM--> 管理程序和 qemu-kvm--> 管理程序?是这些步骤吗 那发生了还是我错了?如果有任何关于 这些东西,请给我链接。非常感谢...

谢谢, 巴拉

【问题讨论】:

    标签: linux linux-kernel kvm qemu


    【解决方案1】:

    我对工作在 x86 架构上的 KVM 部分比较熟悉,所以尝试在 KVM 的 x86 实现中解释这一点。

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

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

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

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

    如果要挖源码,建议先关注CPU虚拟化(Intel VT-x),地址在linux/arch/x86/kvm/vmx.c。英特尔软件开发人员指南还对 VT 进行了全面介绍。

    【讨论】:

      【解决方案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 仿真,这在论文中进行了解释。 它将帮助您了解从客户机模式切换到主机模式的工作原理、切换背后的原因、qemu 如何在用户空间完成 I/O 仿真以及它如何切换回客户机。这些都是优秀的简短论文。

      【讨论】:

      • @Lekensteyn 感谢您的编辑......真的很惊讶有些人如此关心整洁,希望我从现在开始保持我的答案干净。
      【解决方案3】:

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

      【讨论】:

        【解决方案4】:

        qemu-kvm 是否在主机的用户空间中执行?是的,这也是一个性能瓶颈,并且正在开发解决它的方法。查看用于网络的 PCI SR-IOV NIC 和用于光纤通道的 NPIV。它们都是为细分 I/O 控制器而设计的特殊硬件,因此 KVM/qemu 可以将 VM 附加到控制器上的专用通道。

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

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

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

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2018-10-10
          • 1970-01-01
          • 2017-04-22
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2014-12-08
          相关资源
          最近更新 更多