在 Guest系统中IO访问可能分三种:
1,guest 内部执行PMIO指令,guest 会触发VM_EXIT,退出状态是KVM_EXIT_IO;
2,guest内部执行对MMIO空间(如virtio设备的feature协商空间、NOTIFY、设备特有配置空间等,它可以是virtio-pci 的bar空间)的访问,guest 会触发VM_EXIT,退出状态将是KVM_EXIT_MMIO;
3,guest 内部对 “ram物理内存” 的访问,会通过EPT硬件(x86)转化为HPA,进而完成对物理内存的读写(但如果是第一次访问由于EPT页表不存在,会发生EPT_VIOLATION,触发VM_EXIT进而建立EPT表项);
MMIO是将设备I/O映射到 guest 地址空间内,它的实现需要利用EPT机制,guest物理内存(GPA)的虚拟化也是通过EPT机制来完成的。那么VM_EXIT后,KVM需要区分是对MMIO地址的访问还是对ram物理地址的访问,即KVM怎么识别MMIO的pagefault与ram 物理内存的pagefault?是通过EPT页表项的页表项的reserved bits区分。
EPT pagefault:
static int (*kvm_vmx_exit