-
如果生成外部中断
-
如果生成外部中断并且 EFLAGS.IF 被设置
-
如果修改了 CR0-CR4 寄存器
-
异常位图——选择生成虚拟机退出的异常
-
IO 位图——选择生成虚拟机退出的 I/O 地址(IN/OUT 访问)
-
MSR 位图——选择生成虚拟机退出的 RDMSR 或 WRMSR 指令
-
虚拟机进入和退出会强制 TLB 刷新——丢失 VMM / VM 的转换信息
-
为了避免这个问题,每个虚拟机(VPID 0 保留给 VMM)关联一个 VPID(虚拟处理器 ID)标签
-
所有 TLB 条目都被标记
-
在虚拟机进入和退出时,只刷新与标签相关的条目
-
在搜索 TLB 时,只使用当前的 VPID
相比于模拟设备时的陷阱 MMIO,我们可以通过映射到客户机的页表,允许客户机直接访问 MMIO。
设备产生的中断由主机内核处理,并向 VMM 发送信号,VMM 将中断注入到客户机中,就像对于模拟设备一样。
VT-d 使用 I/O MMU(DMA 重映射)来保护和转换虚拟机物理地址。
-
消息传递中断(MSI)= DMA 写入 IRQ 控制器的主机地址范围(例如 0xFEExxxxx)
-
地址的低位和数据指示要发送到哪个 CPU 的哪个中断向量
-
中断重映射表指向应该接收中断的虚拟 CPU(VMCS)
-
I/O MMU 将捕获 IRQ 控制器的写入并在中断重映射表中查找
-
如果该虚拟 CPU 当前正在运行,则直接接收中断
-
否则,在一个表中设置一个位(发布的中断描述符表),下次运行该 vCPU 时将注入中断
-
通过 Tiny Code Generator(TCG)使用二进制翻译进行高效的模拟
-
支持不同的目标和主机体系结构(例如,在 x86 上运行 ARM 虚拟机)
-
进程级和完全系统级的仿真
-
MMU 仿真
-
I/O 仿真
-
可与 KVM 一起用于加速虚拟化
KVM
-
用于硬件虚拟化的 Linux 设备驱动程序(例如 Intel VT-x、SVM)
-
基于 IOCTL 的接口,用于管理和运行虚拟 CPU
-
VMM 组件在 Linux 内核中实现(例如中断控制器、定时器)
-
如果存在,使用影子页表或 EPT
-
使用 qemu 或 virtio 进行 I/O 虚拟化
类型 1 和类型 2 的 Hypervisor
-
类型1 = 裸机 Hypervisor
-
类型2 = 嵌入在现有内核/操作系统中的 Hypervisor
Xen