IOMMU和SMMU详解

news2024/10/5 19:15:41

前言:

IOMMU(输入输出内存管理单元)的原理与CPU中的MMU(内存管理单元)相似。它的作用是管理设备的内存访问请求,允许安全、高效地在设备和内存之间直接传输数据。IOMMU通常用于支持高速数据传输的设备,如图形卡、网络卡和存储设备。 IOMMU与MMU相似,IOMMU是把外部设备地址到存储器地址的转换。IOMMU中存放了IO页表虚实地址转换关系和访问权限,而且处理器加速虚实地址转换,还设置了IOTLB作为IO页表的Cache。
SMMU 专指在ARM架构中使用的内存管理单元,具有与x86/x64架构中的IOMMU相似的功能。它同样实现了设备的地址转换、内存保护、DMA重映射及虚拟化支持等功能。
尽管二者在功能上相似,它们在实现方式、接口和可能使用的特定命名上有所不同。在ARM系统中,通常采用"SMMU"这个术语,而在x86/x64系统中,则更多使用"IOMMU"这个术语。
简而言之,SMMU和IOMMU在概念上是类似的,都提供设备对内存访问的管理,但SMMU特指ARM架构,而IOMMU则是更广泛使用的术语,可包含多种架构,包括x86/x64和ARM。

一、 IOMMU的原理:

地址转换:
IOMMU实现了从设备发出的DMA(直接内存访问)请求中的I/O虚拟地址到物理地址的转换。这能够在设备和系统内存之间提供保护和隔离。

内存保护:
通过确保设备不能读取或写入它们没有权限的内存区域,IOMMU有助于防止恶意设备驱动程序或硬件故障引起的系统崩溃和安全问题。

DMA重映射:
IOMMU可以重映射DMA请求,允许设备看起来像是连续内存区域的非连续物理内存。

支持虚拟化:
IOMMU对于虚拟化也非常重要,因为它允许虚拟机直接且安全地访问硬件设备,而没有性能上的显著损失。

二、 SMMU 工作原理

地址转换:
SMMU负责将设备发出的DMA请求的I/O虚拟地址(IOVA)转换为系统物理地址(PA)。这个转换关系由SMMU内部的转换表维护,类似于CPU中MMU的页表机制。
内存访问控制:
SMMU提供内存访问控制功能,以确保设备只能访问授权的内存区域。这有助于提高系统的安全性,防止未授权的内存访问导致的安全漏洞。
上下文银行和流ID:
SMMU支持多个“上下文银行”(Context Bank),每个银行关联到一个或多个设备,设备通过流ID(Stream ID)被识别。不同的设备DMA请求可以通过不同的上下文银行进行管理,每个上下文银行包含自己的转换表。
虚拟化支持:
SMMU支持虚拟化技术,允许虚拟机(VM)可直接且安全地访问其虚拟设备的硬件资源。SMMU负责为每个VM管理独立的地址映射和内存保护,使得设备可以在不同的VM间高效切换。
缓存维护:
SMMU可以管理和维护一致性缓存以支持DMA操作。这样设备可以使用缓存来提高DMA操作的性能。
中断重映射:
SMMU也能重新映射来自设备的中断,让中断信号能够正确地传递到宿主机或虚拟机中。
在使用中,SMMU的典型工作流程包括:
设备需要执行DMA传输时,发起带有I/O虚拟地址的请求。
SMMU根据内部转换表将IOVA转换为相应的物理地址。
如果转换合法,SMMU允许DMA传输继续;如果地址转换不合法,则可能会生成一个错误报告,并可中断CPU。
传输完成后,SMMU可以确保任何相关缓存都保持一致。

三、ATS (Address Translation Services)

ATS 是 PCI Express (PCIe) 设备支持的一项特性,它允许设备在内部缓存它自己的 I/O 虚拟地址 (IOVA) 到系统物理地址 (PA) 的翻译,这可以减少对 IOMMU 重复地址翻译的需求。具体来说,启用 ATS 的设备可以执行以下操作

3.1 TLP中AT字段

   PCIe总线在TLP中设置了AT字段支持ATS机制,并且只有处理器支持IOMMU时,PCIe设备才可以使用ATS机制。

AT字段为0b00:
当AT字段为0b00时,表示TLP的Address没有通过ATC转换,存放是PCI总线域的物理地址。
1.不支持ATS 机制,处理器不支持IOMMU;TLP的Address是PCI总线域的物理地址,进行DMA操作时,该地址被RC转换为存储器域的物理地址,然后对存储器进行读写操作。
2. 不支持ATS机制,处理器支持IOMMU;TLP的Address是PCI总线域的物理地址,进行DMA操作时,该地址被TA根据I/O页表转换为存储器域的物理地址,然后对存储器进行读写操作。
3. 支持ATS机制,处理器支持IOMMU;进行DMA操作时,该数据被传送到对存储器进行读写操作。

AT字段为0b01:
支持ATS机制的设备必须支持0b01报文,该报文为“Translation Request”,该报文由PCIe设备通过存储器读请求TLP发出,其目的为TA。TA收到报文后将根据I/O页表设置,将合适的地址转换关系通过存储器读完成TLP,发送给PCIe设备,PCIe设备收到这个地址转换关系后,将更新ATC。该TLP有64位和32位两种格式。

3.2 ATS 和 IOMMU 的联系

ATS 与 IOMMU 一起工作时,可以为 PCIe 设备和系统 bieding 更高效的地址翻译服务:

效率改善:
当启用 ATS 的设备需要执行 DMA 操作时,它首先在本地 ATC 中查找地址翻译。如果找到合适的翻译,就不需要再与 IOMMU 通信,提高了效率。

IOMMU的降低负担:
ATS 减少了设备对 IOMMU 的依赖,从而可以减轻 IOMMU 的压力。对 IOMMU 的查询减少意味着总体的系统性能可能提高,特别是在多设备频繁进行 DMA 操作的环境中。

缓存无效化协议:
如果系统内存中的 IOVA 到 PA 的映射发生更改,IOMMU 需要通知所有启用 ATS 的设备更新或无效化它们的 ATC。这是通过一种特定的缓存无效化协议完成的。

安全和一致性:
即使设备使用 ATS 缓存地址翻译,在访问内存之前第一次的地址翻译仍由 IOMMU 管理,确保了系统的安全性。同样,IOMMU 保证即使在使用 ATS 的情况下,系统内存的保护和隔离依然起效。

四、IOMMU/SMMU enable

4.1 x86 架构下

打开BIOS中的虚拟化开关(Intel VT-d)将Disabled置为Enable
在这里插入图片描述
路径 PCI Subsystem Configuration/Intel® VT for Directed I/O置为disable,这里默认置灰,不可修改,需要先修改Processor Configuration/X2APIC 置为Disable才可修改Intel® VT for Directed I/O,将XAPIC置为Disable之后打开Intel® VT for Directed I/O
在这里插入图片描述
在这里插入图片描述
激活linux内核的VT-d开关。
编辑/etc/sysconfig/grub文件(系统引导文件),找到rhgb quiet,在后面添加intel_iommu=on或者amd_iommu=on。
使用grub-mkconfig –o /boot/grub/grub.cfg生成新的系统引导菜单(或者是grub2-mkconfig)
重启使设置生效
使用dmesg | grep -e DMAR -e IOMMU,查看IOMMU是否启用
在这里插入图片描述

4.2 arm架构下

在bios中打开smmu
其余CPU /etc/default/grub GRUB_CMDLINE_LINUX=iommu.passthrough=1 iommu.strict=0配置
生成配置文件grub-mkconfig -o /boot/grub/grub.cfg,
重启系统
dmesg | grep -e DMAR -e smmu查看IOMMU是否打开,下图为打开状态:
在这里插入图片描述

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

了解时间复杂度和空间复杂度

在学习数据结构前,我们需要了解时间复杂度和空间复杂度的概念,这能够帮助我们了解数据结构。 算法效率分为时间效率和空间效率 时间复杂度 一个算法的复杂度与其执行的次数成正比。算法中执行基础操作的次数,为算法的时间复杂度。 我们采…

墨水屏技术在工业智能化领域的创新应用

墨水屏技术在工业智能化领域的创新应用 随着科技的快速发展,各种显示技术层出不穷,其中墨水屏作为一种独特的显示技术,逐渐在工业领域展现出其独特的优势和价值。墨水屏以其低功耗、高对比度和阅读舒适度高等特点,正成为工业应用…

9【PS作图】像素画Tips

放大缩小 “窗口”-排列-为…画布新建窗口,就可以新建一个窗口,实时看作图效果 如果要保持放大或缩小的像素画仍然保持硬边缘,需要设置两个东西 将 编辑 > 首选项 > 常规 中的 插值方式 改为 “邻近(靠近硬边缘&#xff09…

android脱壳第二发:grpc-dumpdex加修复

上一篇我写的dex脱壳,写到银行类型的app的dex修复问题,因为dex中被抽取出来的函数的code_item_off 的偏移所在的内存,不在dex文件范围内,所以需要进行一定的修复,然后就停止了。本来不打算接着搞得,但是写了…

Hadoop伪分布式平台搭建

搭建Hadoop伪分布式环境是在单台机器上模拟完整的Hadoop分布式系统,使得所有的Hadoop守护进程(如NameNode、DataNode、ResourceManager、NodeManager等)都在同一台机器上运行。这样可以在一台机器上体验Hadoop的分布式特性,适合学…

openWebUI+ollamawindows+不用docker+webLite本地安装

openWebUI & ollama & windows & 不用docker & webLite 本地安装 总结一下安装教程 10核CPU16G内存 两个web框架都可以,先说简单的 ollama-webui-lite(https://github.com/ollama-webui/ollama-webui-lite) 轻量级,只使用nodejs 先装…

RTK负载(4K可见光+高分热成像+超广角+激光测距)四光AI智能识别跟踪吊舱技术详解

无人机光电吊舱的RTK负载(4K可见光高分热成像超广角激光测距)AI智能识别跟踪吊舱技术是一种高度集成和先进的无人机观测系统。系统结合了无人机的飞行能力和光电吊舱的多功能传感器,通过集成RTK(实时动态差分定位)技术…

php 编译安装oracel扩展

第一步安装Oracle客户端 1,需要下载基础包和sdk oracle客户端下载链接:Oracle Instant Client Downloads for Linux x86-64 (64-bit) https://www.oracle.com/database/technologies/instant-client/linux-x86-64-downloads.html 选择最新版本 versi…

【智能算法】向日葵优化算法(SFO)原理及实现

目录 1.背景2.算法原理2.1算法思想2.2算法过程 3.结果展示4.参考文献 1.背景 2019年,GF Gomes等人受到自然界向日葵运动行为启发,提出了向日葵优化算法(Sunflower Optimization, SFO)。 2.算法原理 2.1算法思想 SFO模拟向日葵行…

数据库原理与应用实验二 SQL SERVER查询分析器的使用

实验目的和要求 熟悉SQL SERVER环境,熟悉查询分析器的使用,能够熟练运用sql命令完成数据库,基本表、主码、外码和其它必要的约束条件的定义。 实验环境 Windows10 SQLServer 实验内容与过程 1 利用sql建立图书管理数据库,并定…

勒索软件安全防护手册

文章目录 相关背景勒索软件概述勒索软件主要类型文件加密类勒索软件数据窃取类勒索软件系统加密类勒索软件。屏幕锁定类勒索软件 勒索软件典型传播方式利用安全漏洞传播利用钓鱼邮件传播利用网站挂马传播利用移动介质传播利用软件供应链传播利用远程桌面入侵传播 典型勒索软件攻…

string的OJ题

1.字符串相加 给定两个字符串形式的非负整数 num1 和num2 ,计算它们的和并同样以字符串形式返回。 你不能使用任何內建的用于处理大整数的库(比如 BigInteger), 也不能直接将输入的字符串转换为整数形式。 思路:从字…

区块链技术与应用学习笔记(10-11节)——北大肖臻课程

目录 10.分岔 ①什么是分叉? ②导致分叉的原因? ③在比特币新共识规则发布会会导致什么分叉? 什么是硬分叉? 硬分叉例子? 什么是软分叉? 软分叉和硬分叉区别? 软分叉实例 11.问答 转…

【java数据结构-优先级队列向下调整Topk问题,堆的常用的接口详解】

🌈个人主页:努力学编程’ ⛅个人推荐:基于java提供的ArrayList实现的扑克牌游戏 |C贪吃蛇详解 ⚡学好数据结构,刷题刻不容缓:点击一起刷题 🌙心灵鸡汤:总有人要赢,为什么不能是我呢 …

SpringBoot+MyBatis-Plus+jsqlparser实现多租户功能

前言 多租户技术(multi-tenancy technology)是一种软件架构技术,它允许在单个系统实例上为多个用户或组织提供服务,同时确保这些用户之间数据的隔离性。在多租户架构中,每个租户(可以是个人用户、企业、组…

第三节:多路选择器

1.二选一数据选择器,要求如下: 【注】 always语句块里赋值的变量需要是reg型 module fn_sw(a,b,sel,y); input a,b,sel; output y; assign y (sel0)?(a&b):(a^b); endmodule timescale 1ns/10ps module fn_sw_tb; reg a,b,sel; wire y;fn_sw fn_…

python 编程小技巧:# type: 类型注释语法

# type: 是 Python 3.5 引入的一种类型注释语法,用于在代码中指定变量、函数、方法等对象的类型信息,以便 IDE 和类型检查工具等工具能够更好地理解和分析代码。具体来说,# type: 后面可以跟一个类型注释,用于指定对象的类型&…

github+PicGo+obsidian来作为你的免费高效可靠图床吧

前提 一直以来 博客的图床问题都是个大问题 ,如何找到一个 可靠并且 方便的搭建方式 非常重要 今天介绍一种 githubpicGoobsidian的搭建方式 准备github库 生成个人github token 找到个人 设置 生成一个新token 或者已经有的直接用 新生成的token 需要记录下来 这可能是你最后…

Linux---自定义协议

应用层协议 一、协议定制---以网络计算器为例 网络计算机功能---进行-*/^&|的运算并返回结果 请求和响应的结构体如下 // Protocol.hpp #pragma once #include <iostream> #include <memory> class Request { public:Request(){}Request(int data_x, int da…

详解23种设计模式——单例模式

单例模式 | CoderMast编程桅杆单例模式 单例模式是最常用的设计模式之一&#xff0c;他可以保证在整个应用中&#xff0c;某个类只存在一个实例化对象&#xff0c;即全局使用到该类的只有一个对象&#xff0c;这种模式在需要限制某些类的实例数量时非常有用&#xff0c;通常全局…