Amit.pdf

论文的核心突破是设计并实现了vIOMMU(模拟 IOMMU),同时提出两项关键优化,解决了直接设备分配的缺陷,且无需修改虚拟机 OS:

  1. 首次实现 vIOMMU:基于 KVM hypervisor(Intel x86 架构),遵循 Intel VT-d 规范,让未修改的虚拟机可使用 IOMMU 功能,支持内存超配、驱动漏洞防护和重映射能力。
  2. 乐观拆除(Optimistic Teardown):通过延迟拆除 IOMMU 映射,减少重复映射的开销,显著提升性能。
  3. 侧核模拟(Sidecore Emulation):将 vIOMMU 部署在辅助核心,避免 VM-exit 切换开销,进一步优化性能。

Linux 的默认模式会通过放松 IOMMU 保护来提升性能:它会批量失效过期的 IOTLB(IOMMU 中的 I/O 转换后备缓冲器)条目,并每 10 毫秒集中从 IOTLB 中清除这些条目。这种方式确实会降低保护级别 —— 因为在这一短时间窗口内,有缺陷的设备可能通过过期条目成功执行 DMA 事务。尽管如此,对于物理机而言,其性能提升效果十分显著:上述吞吐量从 43% 提升至 91%,这一收益足以证明承担该风险的合理性

image.png

总体而言,侧核硬件模拟遵循与同核模拟相同的核心原理:客户机对设备进行编程,虚拟机监控程序检测到客户机的设备访问操作,解析访问的语义并模拟硬件行为。但侧核模拟与同核模拟存在两项根本性差异:第一,当客户机访问设备寄存器时,无需触发从客户机到虚拟机监控程序的昂贵陷阱(trap),取而代之的是,设备寄存器内存区域由客户机与虚拟机监控程序共享,虚拟机监控程序通过轮询(polling)模拟控制寄存器以获取更新;第二,客户机代码与虚拟机监控程序代码在不同核心上运行,这减少了缓存污染,同时提升了各核心专属缓存的利用率。 侧核模拟能否高效运行,取决于 I/O 设备与客户机操作系统之间的接口 —— 因为侧核是通过轮询内存区域获取更新,而非接收离散寄存器访问事件的通知。