输入输出内存管理单元 (IOMMU),有时也称为系统 MMU (SMMU),是一个系统级内存管理单元 (MMU),用于将具有直接内存访问(DMA)功能的输入/输出 (I/O) 设备连接到系统内存。
没有 IOMMU 时:
有 IOMMU 时:
以 Spec 中的图5为例,该 SOC 集成了内存控制器和多个 IO 设备,还集成了两个 IOMMU 实例。
设备可以直接连接到 IO Bridge 和系统互连,也可以在需要将 IO 协议事务转换为系统互连事务时通过 Root Port 连接。
第一个 IOMMU 实例 IOMMU 0(与 IO Bridge 0 相关联)将一个 Root Port 连接到系统结构/互连(Root Port 是一个 PCIe 端口),一个或多个终端设备通过该 Root Port 与 SoC 连接。
第二个IOMMU 实例 IOMMU 1(与 IO Bridge 1 相关联)说明了在不使用 Root Port 的情况下将设备(IO 设备 A 和 B)连接到系统架构的情况。
Host interface:它是连接 IOMMU 的接口,供 Harts 访问其内存映射寄存器,并执行全局配置和/或维护操作。
Data structure interface:它被 IOMMU 用于隐式访问内存。用于从主内存中获取所需的数据结构。
Device Translation Request:从 IO Bridge 接收转换请求。在此接口上,IO Bridge 提供有关请求的信息。
**ATS **:如果 IOMMU 支持可选的 PCIe ATS 功能,则 ATS 接口用于通过 PCIe Root Port 与具有 ATS 功能的 EP(Endpoint,即 PCIe 设备) 通信。
节选出了我认为有助于理解 IOMMU 的部分
对于这种情况,我的理解是:
- 用来做保护的,限制 DMA 能访问的物理内存区域
- 支持可以使用分散的物理内存区域
传统的 32 位设备无法访问超过 4 GiB 的内存。如果没有 IOMMU,操作系统就必须通过分配在 4 GiB 以下内存中的缓冲区来复制数据。
对于这种情况,我的理解是:
- Hypervisor 提供 GPA->SPA 转换,限制 Guest OS 访问的物理内存
- 同时也支持仅OS的情况,可以使用分散的物理内存
- 对于使用 MSI 中断的设备,可以借助 IOMMU 找到 VM 对应的中断文件
对于这种情况,我的理解是: