转载自https://www.dazhuanlan.com/
1. 什么是IOMMU
IOMMU(Input/Output Memory Management Unit)是一个内存管理单元(Memory Management Unit),它的作用是连接DMA-capable I/O
总线(Direct Memory Access-capable I/O Bus)和主存(main memory)。传统的内存管理单元会把CPU访问的虚拟地址转化成实际的物理地址。而IOMMU则是把设备(device)访问的虚拟地址转化成物理地址。
2. 为什么要有IOMMU
首先,我们看下没有IOMMU的世界吧。
2.1 physical DMA without IOMMU
这种情况面临下面几个问题:
一些设备需要大量的物理连续内存,但是os无法为其分配。可以有如下解决方案:
- 在内核启动时为设备保留内存
- 将MMU内嵌到设备中,如GPU
一些设备有DMA寻址限制,例如,只支持32位的DMA寻址。可以有如下解决方案:
- Bounce buffer
- 没有内存保护机制,设备可能会错误地访问内存地址
- 不能支持PCI设备的pass-through
接下来,我们看下拥有IOMMU的世界吧。
2.2 with IOMMU
使用更大的DMA寻址空间
- 每个设备都用自己独立的DMA内存寻址空间
使用更大的连续DMA内存
- 可以将非连续的物理内存映射到连续的DMA内存空间中
- 避免使用scatter-gather list
- 避免使用Bounce buffer
提供了访问内存保护机制
- 防止设备错误地访问内存
- 支持PCI设备的pass-through
3.IOMMU在虚拟化中的用途
IOMMU的一个重要用途是在虚拟化技术(virtualization):虚拟机上运行的操作系统(guest OS)通常不知道它所访问的host-physical内存地址。如果要进行DMA操作,就有可能破坏内存,因为实际的硬件(hardware)不知道guest-physical和host-physical内存地址之间的映射关系。IOMMU根据guest-physical和host-physical内存地址之间的转换表(translation table),re-mapping硬件访问的地址,就可以解决这个问题。
在AMD的VIRTUALIZING IO THROUGH THE IO MEMORY MANAGEMENT UNIT (IOMMU)文档中,也有一个更全面的总结图:
引入虚拟化后,带来的问题是:设备看到的是GPA(guest physical address),但是访问的是HPA(host physical address)。
3.1 per-BDF DMA remapping
DMA Remapping通过IOMMU页表方式将直通设备对内存的访问限制到特定的domain中,在提高IO性能的同时完成了直通设备的隔离,保证了直通设备DMA的安全性。
3.2 interrupt remapping
Interrupt Remapping则提供IO设备的中断重映射和路由功能,来达到中断隔离和中断迁移的目的,提升了虚拟化环境下直通设备的中断处理效率。
为什么要搞中断重映射这么一套东西呢?直通设备的中断不能直通到虚拟机内部吗? 我们知道直通场景下直通设备的MSI/MSI-X Msg
信息都是由Guest直接分配的,那么问题来了:设备发送中断的时候写的Msg地址是GPA,肯定不能直接往host上投递,否则就乱套了。在虚拟化场景下,直通设备的中断是无法直接投递到Guest中的,那么我们该怎么办?我们可以由IOMMU截获中断,先将中断映射到host的某个中断上,然后再重定向(由VMM投递)到Guest内部。
对于MSI/MSI-X中断机制的相关知识,会在后续的文章中陆续推出。
评论 (0)