我更熟悉在 x86 架构上工作的 KVM 部分,所以尝试在 KVM 的 x86 实现中解释这一点。
在 x86 架构中,KVM 利用 CPU 的功能来分离管理程序和访客模式。在 Intel 术语中,它们分别是 VMX 根模式和非根模式。
VM条目(管理程序-> VM)由KVM使用VMLAUNCH指令触发,所有客人需要的信息在内核模式下填充到CPU的VMCS中。只有从 qemu-kvm 调用到 kvm 内核模块的系统调用。
虚拟机退出发生在客户操作系统正在处理超出其权限的事情时,例如访问物理硬件或发生中断。之后,发出 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 进行了全面介绍。