linux - kvm 中如何进行设备模拟

标签 linux linux-kernel kvm qemu

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

谢谢, 巴拉

最佳答案

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

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

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

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

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

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

关于linux - kvm 中如何进行设备模拟,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3125019/

相关文章:

java - J48 在 weka 资源管理器中不工作

linux - 有效的 shell 脚本输入日期格式

PHP 执行 Sudo/Exim 命令

php - 升级运行 Upstart + PHP + SWF 事件脚本直到事件完成

我可以为 __user 参数传递一个指向 linux 内核空间的指针吗?

interrupt - qemu kvm : how to get permformance monitoring interrupt?

linux - Linux 3.+中Linux 2.6对应的/dev/dsp在哪里?

c - "arm64/kernel/asm-offsets.c"的用途是什么?

c - 在KVM中拦截RDTSC指令

linux - qcow2 header 有多大?