您的当前位置:首页正文

了解 RISC-V IOMMU

2024-11-07 来源:个人技术集锦

了解 RISC-V IOMMU

一、IOMMU 的背景

输入输出内存管理单元 (IOMMU),有时也称为系统 MMU (SMMU),是一个系统级内存管理单元 (MMU),用于将具有直接内存访问(DMA)功能的输入/输出 (I/O) 设备连接到系统内存

没有 IOMMU 时:

有 IOMMU 时:

  1. 使得设备 DMA 更加安全,可以限制设备能够访问的物理内存
  2. 地址转换 IOVA -> PA,可以支持连续的 IOVA,非连续的 PA,可以利用物理内存中分散的页
二、IOMMU 在 SOC 中的位置

以 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 导言

节选出了我认为有助于理解 IOMMU 的部分

四、IOMMU 的几种使用模式
1、非虚拟化 OS 的情况

对于这种情况,我的理解是:

  1. 用来做保护的,限制 DMA 能访问的物理内存区域
  2. 支持可以使用分散的物理内存区域

传统的 32 位设备无法访问超过 4 GiB 的内存。如果没有 IOMMU,操作系统就必须通过分配在 4 GiB 以下内存中的缓冲区来复制数据。

2、Hypervisor 的情况

对于这种情况,我的理解是:

  1. Hypervisor 提供 GPA->SPA 转换,限制 Guest OS 访问的物理内存
  2. 同时也支持仅OS的情况,可以使用分散的物理内存
  3. 对于使用 MSI 中断的设备,可以借助 IOMMU 找到 VM 对应的中断文件

3、Guest OS 的情况

对于这种情况,我的理解是:

显示全文