了解 RISC-V IOMMU

了解 RISC-V IOMMU

个人作为 IOMMU 初学者,从初学者的角度介绍我眼中 RISCV 的 IOMMU

如果有些描述不够专业,还请谅解,也欢迎讨论

部分内容来自 https://zhuanlan.zhihu.com/p/679957276(对于 RISCV IOMMU 规范手册的翻译,推荐前往此链接查找更详细的内容),同时增加了部分自己的理解

如侵删

一、IOMMU 的背景

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

没有 IOMMU 时:

  1. 非虚拟化的情况下,IO 设备得到的是物理地址,在进行 DMA 时可能破坏其他的设备或者系统内存

  2. 虚拟化的情况下,Guest OS 不能直接访问 PA,每次 DMA 操作都要陷入到 VMM 为 I/O 设备分配物理内存

有 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)连接到系统架构的情况。

IO Bridge 位于设备和系统互连之间,用于处理 DMA 事务,IO 设备可使用 IO 虚拟地址(VA、GVA 或 GPA)执行 DMA 事务,IO Bridge 调用相关的 IOMMU,将 IOVA 转换为监控器物理地址 (SPA)。

在这里插入图片描述

Host interface:它是连接 IOMMU 的接口,供 Harts 访问其内存映射寄存器,并执行全局配置和/或维护操作

Data structure interface:它被 IOMMU 用于隐式访问内存。用于从主内存中获取所需的数据结构

Device Translation Request:从 IO Bridge 接收转换请求。在此接口上,IO Bridge 提供有关请求的信息。

Device Translation Completion:用于提供 IOMMU 对先前请求的地址转换的完成响应。

**ATS **:如果 IOMMU 支持可选的 PCIe ATS 功能,则 ATS 接口用于通过 PCIe Root Port 与具有 ATS 功能的 EP(Endpoint,即 PCIe 设备) 通信。

三、IOMMU 导言

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

对于通过 IOMMU 连接到系统的每个 I/O 设备,软件都可以在 IOMMU 上配置设备上下文,将特定的虚拟地址空间和其他针对设备的参数与设备关联起来。通过在 IOMMU 为每个设备提供独立的设备上下文,可以为每个设备单独配置一个操作系统,这个操作系统可以是 Guest OS,也可以是主(主机)操作系统。在设备发起的每一次内存访问中,IOMMU 都会通过某种形式的唯一设备标识符来识别发起访问的设备,然后IOMMU 会使用该标识符在软件提供的数据结构中找到相应的设备上下文。本规范将这种唯一的设备标识符称为 device_id,并支持多达 24 位宽的标识符。

某些设备可能支持共享虚拟寻址,即与设备共享进程地址空间的功能。为支持此类寻址,软件可将一个或多个进程上下文配置到设备上下文中。此类设备启动的每次内存访问都会伴随一个唯一的进程标识符,IOMMU 将该标识符与唯一的设备标识符结合使用,以定位软件在设备上下文中配置的适当进程上下文。例如,对于 PCIe,进程上下文可由唯一的 20 位进程地址空间标识符 (PASID) 标识。本规范将此类唯一进程标识符称为 process_id,并支持多达 20 位宽的标识符。

IOMMU 采用两阶段地址转换流程,将 IOVA 转换为 SPA,并对 DMA 实施内存保护。为了执行地址转换和内存保护,IOMMU 在第一阶段和第二阶段地址转换中使用与 CPU 的 MMU 相同的页表格式。使用与 CPU MMU 相同的页表格式,可以消除 DMA 在内存管理方面的一些复杂性。使用相同的格式还允许 CPU MMU 和 IOMMU 同时使用相同的页表。

IOMMU 采用的虚拟内存方案可为每个设备单独配置 IOMMU。设备使用 I/O 虚拟地址 (IOVA) 执行 DMA。根据为设备选择的虚拟内存方案,设备使用的 IOVA 可能是 Supervisor 物理地址 (SPA)、Guest 物理地址 (GPA) 或虚拟地址 (VA)

IOMMU 中的 DMA 地址转换对 DMA 访问有一定的性能影响,因为使用软件提供的数据结构确定 SPA 所需的时间可能会延长访问时间。CPU MMU 中的类似开销通常是通过使用转换旁路缓冲器(TLB)来缓存这些地址转换,以便在后续访问中重复使用,从而减少转换开销。IOMMU 可以使用类似的地址转换缓存,即 IOMMU 地址转换缓存(IOATC)。当用于地址转换的内存驻留数据结构被修改时,IOMMU 为软件提供了使IOATC 与之同步的机制。软件可使用软件定义的上下文标识符(称为 Guest 软件上下文标识符 (GSCID))配置设备上下文,以’指示设备集合被分配给同一虚拟机’,从而访问共同的虚拟地址空间。软件可使用称为进程软件上下文标识符(PSCID)的软件定义上下文标识符配置进程上下文,以标识’共享共同虚拟地址空间的进程’集合。IOMMU 可使用 GSCID 和 PSCID 标记 IOATC 中的条目,以避免重复并简化失效操作。

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

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

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

IOMMU 为操作系统提供了一种机制,通过限制设备可访问的内存来防止这种意外损坏。如图所示,操作系统可通过页表配置 IOMMU,以转换 IOVA,从而将可访问的地址限制在页表允许的范围内

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

IOMMU 可用于执行分散/聚集(scatter/gather)DMA,它允许为 I/O 分配较大的内存区域,而无需所有内存都是连续的一个连续的虚拟地址范围可以映射到这些零散的物理地址,并用虚拟地址范围对设备进行编程。

IOMMU 可用于支持共享虚拟寻址,即与设备共享进程地址空间。用于 DMA 的虚拟地址由 IOMMU 转换为SPA。

当 IOMMU 被非虚拟化操作系统使用时,第一阶段足以提供所需的地址转换和保护功能,第二阶段可设置为 “Bare”。

在这里插入图片描述

2、Hypervisor 的情况

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

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

直接控制设备的 Guest OS 将使用 GPA 对设备进行编程。当设备使用这些地址执行内存访问时,IOMMU 就会使用 Hypervisor 提供的地址转换数据结构,负责将这些 GPA 转换为 SPA 。

在这里插入图片描述

为了处理由 Guest OS 控制的设备发出的 MSI,Hypervisor 会配置 IOMMU,将这些 MSI 重定向到 IMSIC 中的 Guest 中断文件(见下图)或内存驻留中断文件。IOMMU 负责使用 Hypervisor 提供的 MSI 地址转换数据结构来执行 MSI 重定向。

在这里插入图片描述

3、Guest OS 的情况

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

以上两种情况的结合,第一阶段地址翻译为了让 Guest OS 感知不到 Hypervisor 的存在,以为自己是一个物理机上的 OS(即第一种情况),第二阶段翻译对应以上的第二种情况

Hypervisor 可以通过硬件仿真或让 Guest OS 使用 Hypervisor 的软件接口来提供虚拟IOMMU 设施。Guest OS 可以使用虚拟 IOMMU 提供的设施,通过使用它所控制的第一阶段页表,获得与非虚拟化操作系统相同的好处。Hypervisor 会建立一个由其控制的第二阶段页表,以虚拟化虚拟机的地址空间,并包含从传递给虚拟机的设备到与虚拟机相关的内存的内存访问。

启用两阶段地址转换后,IOVA 首先使用 Guest OS 管理的第一阶段页表转换为 GPA,然后使用 Hypervisor 管理的第二阶段页表将 GPA 转换为 SPA

IOMMU 配置为使用设备 D1 的第一阶段和第二阶段页表执行地址转换。第二阶段通常由 Hypervisor 用于将 GPA 转换为 SPA,并将设备 D1 限制为与 VM-1 相关的内存第一阶段通常由 Guest OS 配置,将 VA 转换为 GPA,并将设备 D1 的访问限制在 VM-1 内存的子集上

对于设备 D2,只有第二阶段处于激活状态,第一阶段设置为 “Bare”,我认为可以看作没有 OS 配置页表的情况,即看作使用没有使用虚拟地址的 RTOS 或者裸机程序。

Hypervisor 也可以保留一个设备(如 D3)供自己使用。第一阶段足以为设备 D3 提供所需的地址转换和保护功能,第二阶段设置为 “Bare”,这种情况和在没有虚拟化的 OS 类似。

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/547614.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

深入理解go语言中的切片

写在文章开头 从一个Java的开发角度来看,切片我们可以理解为Java中的ArrayList即一种动态数组的实现,本文会从源码的角度对切片进行深入剖析,希望对你有帮助。 Hi,我是 sharkChili ,是个不断在硬核技术上作死的 java …

前端框架模板

前端框架模板 1、vue-element-admin vue-element-admin是基于element-ui 的一套后台管理系统集成方案。 **功能:**https://panjiachen.github.io/vue-element-admin-site/zh/guide/#功能 **GitHub地址:**GitHub - PanJiaChen/vue-element-admin: :t…

Win 运维 | Windows Server 系统事件日志浅析与日志审计实践

[ 重剑无锋,大巧不工。] 大家好,我是【WeiyiGeek/唯一极客】一个正在向全栈工程师(SecDevOps)前进的技术爱好者 作者微信:WeiyiGeeker 公众号/知识星球:全栈工程师修炼指南 主页博客: 【 https://weiyigeek.top 】- 为者常成&…

【Mamba】医学图像分割的Mamba评估指标参考(更新中...)

医学图像分割的Mamba评估指标参考 VM-UNet&VM-UNetV2LightM-UNetUltraLight-VM-UNetH-vmunetU-MambaLMa-UNetMamba-UNetVM-UNet&VM-UNetV2 DatasetModelmIoU(%)↑DSC(%)↑Acc(%)↑Spe(%)↑Sen(%)↑ISIC17UNet76.9886.9995.6597.4386.82ISIC17UTNetV277.3587.2395.8498.…

Java开发从入门到精通(十):Java常用的API编程接口:String

Java大数据开发和安全开发 (一)Java常用的API1.1 什么是API1.2 什么叫做包1.2.1 如何调用其他包的程序 1.3 JAVA的API:String1.3.1 创建String对象1.3.2 String提供的操作字符串数据的常用方法1.3.3 String练习案例 (一)Java常用的API 1.1 什么是API API(全称 App…

Ubuntu安装VMVare Workstation pro 17.5.1

由于需要装Kali,我电脑是Ubuntu单系统,所以只能使用linux版本的虚拟机,通过这种方式来安装虚拟机和Kali镜像。 参考CSDN博客资料:https://blog.csdn.net/xiaochong0302/article/details/127420124 github代码资料:vm…

2024 CKA 基础操作教程(十二)

题目内容 考点相关内容分析 Pods Pod 是可以在 Kubernetes 中创建和管理的、最小的可部署的计算单元。 Pod 是 Kubernetes 中的原子单元,用于封装应用程序的一个或多个容器、存储资源、唯一的网络 IP,以及有关如何运行容器的选项。Pod 提供了一个共享的…

如何实现超大场景三维模型数据立体裁剪

如何实现超大场景三维模型数据立体裁剪 实现超大场景三维模型数据的立体裁剪可以采用如下方法: 数据预处理:将超大场景三维模型数据进行划分和分割,将其拆分成多个小块或网格。这样可以方便进行后续的裁剪操作。 裁剪算法选择:根据…

场景文本检测识别学习 day04(目标检测的基础概念)

经典的目标检测方法 one-stage 单阶段法:YOLO系列、SSD系列 one-stage方法:仅预测一次,直接在特征图上预测每个物体的类别和边界框输入图像之后,使用CNN网络提取特征图,不加入任何补充(锚点、锚框&#x…

OpenHarmony轻量系统开发【2】源码下载和开发环境

2.1源码下载 关于源码下载的,读者可以直接查看官网: https://gitee.com/openharmony/docs/tree/master/zh-cn/release-notes 本文这里做下总结: (1)注册码云gitee账号。 (2)注册码云SSH公钥…

如何采集opc服务器数据上传云端

为了进一步提高生产效率,生产制造的不断朝着智能化发展和升级,传统的自动化生产系统已经不能满足需求。传统的SCADA系统一般是用于现场的数据采集与控制,但是本地控制已经无法满足整个工厂系统智能化数字化的需求,智能化数字化是需…

【Altium Designer 20 笔记】PCB线宽与过孔尺寸

电源线:40mil1A(一般翻倍给),地线比电源线粗一点即可;信号线:10-15mil 一、线宽 市电的火线和零线:80-100mil12V /24V 20mil~60mil 5V 20-30mil 3V 20-30mil GND 越宽越好20-30mil普通信号线 10mil-15mil…

Qt 3 QVariant类的使用和实例

QVariant, 类本质为 C联合(Union)数据类型,它可以保存很多Qt 类型的值,包括 QBrush、QColor、QString 等等。也能够存放Qt的容器类型的值。QVariant::StringList 是 Qt定义的一个 QVariant::type 枚举类型的变量,其他常用的枚举类型变量如下表…

LabVIEW变速箱自动测试系统

LabVIEW变速箱自动测试系统 在农业生产中,采棉机作为重要的农用机械,其高效稳定的运行对提高采棉效率具有重要意义。然而,传统的采棉机变速箱测试方法存在测试效率低、成本高、对设备可能产生损害等问题。为了解决这些问题,开发了…

网站添加PWA支持,仅需三步,无视框架的类型

总结起来,网站配置PWA简单步骤为: 编写 manifest.json;编写 serviceWorker.js;在 index.html 引入上述两个文件;把上述三个文件放在网站根目录(或者同一目录下);网站需要部署在https环境才能触发&#xff…

偏微分方程算法之二维初边值问题(交替方向隐(ADI)格式)

一、研究对象 以二维抛物型方程初边值问题为研究对象: 为了确保连续性,公式(1)中的相关函数满足: 二、理论推导 2.1 向前欧拉格式 首先进行网格剖分。将三维长方体空间(二维位置平面一维时间轴&#xff09…

微服务之CircuitBreaker断路器

一、概述 1.1背景 在一个分布式系统中,每个服务都可能会调用其它的服务器,服务之间是相互调用相互依赖。假如微服务A调用微服务B和微服务C,微服务B和微服务C又调用其他的微服务。这就是构成所谓“扇出”。 如果扇出的链路上某个微服务的调…

图数据库Neo4J入门——Neo4J下载安装+Cypher基本操作+《西游记》人物关系图实例

这里写目录标题 一、效果图二、环境准备三、数据库设计3.1 人物节点设计3.2 关系设计 四、操作步骤4.1 下载、安装、启动Neo4J服务4.1.1 配置Neo4J环境变量4.1.2 启动Neo4J服务器4.1.3 启动Ne04J客户端 4.2 创建节点4.3 创建关系(从已有节点创建关系)4.4…

数据结构和算法(哈希表和图(A*算法精讲))

一 、哈希表 1.1 哈希表原理精讲 哈希表-散列表,它是基于快速存取的角度设计的,也是一种典型的“空间换时间”的做法 键(key): 组员的编号如,1、5、19。。。 值(value): 组员的其它信息(包含性别、年龄和…

并查集练习

前言&#xff1a; 关于并查集的一些训练题。 正文&#xff1a; 1.亲戚&#xff1a; #include<bits/stdc.h> using namespace std; const int N5005; int fa[N]; int find(int x){if(xfa[x])return x;return fa[x]find(fa[x]); } void merge(int x,int y){fa[find(x)]fi…