IOMMU简介
IOMMU(Input-Output内存管理单元)是内存控制器的一部分,用于将设备虚拟机地址(也可称为io地址或设备地址)转换为物理地址。IOMMU与MMU的区别在于,IOMMU是将设备虚拟机地址转换为物理地址,而MMU是将CPU虚拟地址转换为物理地址。
PCI设备虚拟化模型
PCI设备虚拟化模型主要有两种:虚拟化模型和透传模型
虚拟化模型(基于虚拟机监视器的设备虚拟化)
VMM需要完成guest os与对应的物理设备之间的交互。意味着,VMM需要进行设备地址的转换(设备可见的虚拟地址与物理地址之间的转换),这将消耗更多的CPU资源,且在存在大量IO的时候会极大的影响系统性能。
透传模型
如图所示,在guest os与物理设备的交互中VMM被旁路掉。在这种模式下VMM无需部署专门的软件来进行设备的模拟和地址转换,从而通过这种硬件辅助的方式提高系统性能。
linux内核中的IOMMU子系统
linux内核中iommu子系统——总体概述
IOMMU子系统包含三层:
- IOMMU DMA层:该层主要完成DMA请求的接收,并将其转发至IOMMU通用层。是DMA-API与IOMMU-API之间的连接层。
- IOMMU 通用层:该层提供通用的IOMMU接口用于完成IO