操作系统概念(一)——IOMMU学习

系列文章目录

提示:本系列主要记录工作过程中遇到的操作系统基础概念以及工作原理

  • 第一章 操作系统之IOMMU

文章目录

  • 系列文章目录
  • 1. 设备访问内存的几种主要方式
    • 1.1 传统的 I/O 访问(程序控制 I/O)
    • 1.2 直接内存访问(DMA)
    • 1.3 设备驱动与内存映射
  • 2. IOMMU简介
  • 3. IOMMU的作用
    • 3.1 提高了内存安全性
    • 3.2 解决 32 位设备的地址扩展问题
  • 4. 总结


1. 设备访问内存的几种主要方式

1.1 传统的 I/O 访问(程序控制 I/O)

在最早的计算机系统中,设备通过 CPU 执行 I/O 操作来访问内存。这种方式也称为 程序控制 I/O。

  • 操作方式:设备通过 CPU 发起 I/O 请求,CPU 会根据程序中的指令,手动读取或写入内存。
    例如,磁盘控制器向内存中写入数据时,CPU 会通过一系列指令来控制数据传输。
  • 缺点:CPU 必须参与每次数据传输,这样不仅增加了 CPU 的负担,还导致了 CPU 的效率低下,因为它需要等待设备完成数据传输。这种方法效率低,尤其是在大量数据传输时。

1.2 直接内存访问(DMA)

DMA(Direct Memory Access) 是一种提高设备访问内存效率的方法

  • 操作方式:在 DMA 模式下,设备可以直接与内存进行数据交换,无需 CPU 参与数据传输过程。
  • 特点:DMA模式下的关键硬件叫DMAC(Controller),我理解该硬件的诞生就是为了将设备访问内存时cpu的职责进行了析出,从而让cpu做其它更重要的事(毕竟cpu是万金油,啥都需要它)。

1.3 设备驱动与内存映射

在现代操作系统中,设备访问内存通常是通过设备驱动程序进行的。驱动程序负责与硬件设备进行通信,并将设备的内存空间映射到进程的虚拟地址空间中。

  • 操作方式:驱动程序通过操作系统提供的接口将设备内存映射到用户空间或内核空间。当应用程序或操作系统需要访问设备时,它直接操作映射到内存中的数据。
    这种方式通常用于高性能的 I/O 操作,如网络通信、显卡渲染等。

2. IOMMU简介

IOMMU(Input/Output Memory Management Unit)是内存控制器( memory controller)的一部分,用于将设备虚拟地址(也可称为I/O地址或设备地址)转换为物理地址

IOMMU的概念类似于MMU(Memory Management Unit),区别在于:

  • IOMMU:将设备虚拟地址翻译为物理地址;
  • MMU:负责将CPU虚拟地址翻译为物理地址。

在设备做DMA访问内存的时候,系统返回给设备驱动的不再是物理地址,而是虚拟地址 ,这个地址一般叫IOVA,设备访问内存时,由IOMMU来将这个设备虚拟地址转换为物理地址。

在这里插入图片描述

从上图可知,IOMMU是DMA(直接内存访问,即设备与内存直接通信,而无需经过CPU)过程中的一个环节。1

因此IOMMU可以看作一种机制,也可以说:IOMMU是DMA的一种实现方式


3. IOMMU的作用

IOMMU的引人带来了哪些好处呢?

  • 提高了内存安全性;
  • 扩展设备地址访问范围;

3.1 提高了内存安全性

传统方式(设备直接访问物理地址),设备可能会访问到不属于自己的内存区域(例如:破坏操作系统的内存结构),造成数据泄漏或系统崩溃。

相反,基于IOMMU机制的DMA内存访问方式,IOMMU 可以在内存访问之前进行检查,确保设备只能访问其分配的内存区域,防止设备访问操作系统的核心数据结构或其他虚拟机的内存,这对于防止设备对其他虚拟机或操作系统内存的恶意或意外访问至关重要。

结论: IOMMU使得设备无法直接访问物理地址,大大增加了设备进行DMA攻击的难度。


3.2 解决 32 位设备的地址扩展问题

设备访问 4GB 以上内存的问题:许多传统的设备(例如 32 位 DMA-capable 设备、网卡、硬盘控制器等)不能直接访问超过 4GB 的内存,因为它们只能使用 32 位的地址空间。但是,现代操作系统的内存往往大于4GB。
如果设备申请DMA(设备直接访问内存)时,内核为设备分配的DMA buffer地址高于4GB(简称为high buffer),则设备将无法寻址到它。

IOMMU通过地址转换提供了解决方案:IOMMU 需要提供一种间接方式,让设备能够通过低地址的缓冲区(low buffer)来与高地址的内存(high buffer)进行交互。这一过程通常被称为 “sync” 或 “bounce” 机制,具体过程如下:

  • 设备请求访问高地址内存:假设设备需要访问 4GB 以上的内存(high buffer),但设备无法直接寻址到高地址,因为它只能使用 32 位地址。

  • IOMMU 为设备分配低地址内存(low buffer):IOMMU 会为设备分配一个低于 4GB 的内存区域(low buffer),这块内存与高地址内存(high buffer)的大小一致。
    设备会通过低地址缓冲区(low buffer)进行 DMA 操作。虽然设备只能访问 low buffer,但通过 IOMMU 的映射,它的请求会在后台被转换成访问高地址内存(high buffer)。

  • IOMMU 进行数据同步:设备向低地址缓冲区(low buffer)写入数据后,IOMMU 会将 low buffer 中的数据复制到高地址缓冲区(high buffer)。反之,CPU 或其他系统组件向高地址缓冲区(high buffer)写入数据时,IOMMU 会将数据从 high buffer 复制到低地址缓冲区(low buffer)。

  • 数据传递与同步:通过这种方式,尽管设备无法直接访问超过 4GB 的内存,但它通过 low buffer 间接完成了数据读写。

在这里插入图片描述

结论:IOMMU 的“sync”或“bounce”机制确保了设备和 CPU 可以通过这两个内存区域交换数据,从而实现了高地址内存的间接访问。


4. 总结

本文主要介绍了设备访问内存的几种方式,以及IOMMU的基本概念、主要作用。

后续有时间再学习下虚拟化中IOMMU的作用2


  1. Linux x86-64 IOMMU详解(一)——IOMMU简介 ↩︎

  2. linux内核中IOMMU 基础架构介绍 ↩︎

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

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

相关文章

计算机网络:网络层 —— IP 多播技术

文章目录 基本概念IP多播地址和多播组 IP多播的类型硬件多播将IPv4多播地址映射为多播MAC地址 基本概念 多播(Multicast,也称为组播)是一种实现“一对多”通信的技术,允许一台或多台主机(多播源)发送单一数…

windows运行ffmpeg的脚本报错:av_ts2str、av_ts2timestr、av_err2str => E0029 C4576

问题描述 我目前的环境是: 编辑器: Microsoft Visual Studio Community 2022 (64 位) 运行的脚本是ffmpeg自带的remux样例,只不过我想用c语言执行这个样例。在执行的过程中报错如下图: C4576 后跟初始值设定项列表的带圆括…

翻译工具开发技术笔记:《老挝语翻译通》app支持语音识别翻译功能,怎么提高语音识别的准确度呢?

《老挝语翻译通》app是一款专为老挝语翻译设计的免费工具,支持文本翻译、老挝文OCR文字识别提取、文字转语音。这款工具以其技术优势和用户友好的界面,为用户提供了便捷的老挝语翻译体验。 技术特点 文本翻译:支持双语输入,提供精…

Linux系统每日定时备份mysql数据

一、创建存储脚本的文件夹 创建文件夹,我的脚本放在/root/dbback/mysql mkdir ... cd /root/dbback/mysql 二、编写脚本 vi backup_mysql.sh 复制脚本内容 DB_USER"填写用户名" DB_PASSWORD"填写密码" DB_NAME"数据库名称" # …

MySQL基础-单表查询

语法 select [distinct] 列名1,列名2 as 别名... from数据表名 where组前筛选 group by分组字段 having组后筛选 order by排序的列 [asc | desc] limit 起始索引,数据条数 测试数据 # 建测试表 create table products (id int primary key a…

【Linux】Linux管道揭秘:匿名管道如何连接进程世界

🌈个人主页:Yui_ 🌈Linux专栏:Linux 🌈C语言笔记专栏:C语言笔记 🌈数据结构专栏:数据结构 🌈C专栏:C 文章目录 1.什么是管道 ?2. 管道的类型2.1 匿…

前端学习Day13 CSS盒子的定位(固定定位篇“附练习”)

一、固定定位 固定定位 (position:fixed)其实是绝对定位的子类别,一个设置了 position:fixed 的元素是相对于视窗固定的,就算页面文档发生了滚动,它也会一直待在相同的地方。 ⚠️:固定定位会脱离文档流。…

Linux云计算 |【第五阶段】CLOUD-DAY9

主要内容: Metrics资源利用率监控、存储卷管理(临时卷ConfitMap、EmptyDir、持久卷HostPath、NFS(PV/PVC)) 一、Metrics介绍 metrics是一个监控系统资源使用的插件,可以监控Node节点上的CPU、内存的使用率,或Pod对资…

BM25:最佳匹配 ,文本相关性评分算法

目录 BM25:最佳匹配 一、BM25算法原理 二、BM25算法的应用场景 三、BM25算法的举例说明 BM25:最佳匹配 BM25(Best Matching 25)是一种在信息检索领域中广泛使用的文本相关性评分算法。它基于概率模型,考虑了词频(Term Frequency,TF)、逆文档频率(Inverse Documen…

论文阅读笔记:Image Processing GNN: Breaking Rigidity in Super-Resolution

论文阅读笔记:Image Processing GNN: Breaking Rigidity in Super-Resolution 1 背景2 创新点3 方法4 模块4.1 以往SR模型的刚性4.2 图构建4.2.1 度灵活性4.2.2 像素节点灵活性4.2.3 空间灵活性 4.3 图聚合4.4 多尺度图聚合模块MGB4.5 图聚合层GAL 5 效果5.1 和SOTA…

【游戏引擎之路】登神长阶(十二)——DirectX11教程:If you‘re going through hell, keep going!

【游戏引擎之路】登神长阶(十二)——DirectX11教程:If youre going through hell, keep going! 2024年 5月20日-6月4日:攻克2D物理引擎。 2024年 6月4日-6月13日:攻克《3D数学基础》。 2024年 6月13日-6月20日&#x…

编写虚拟的GPIO控制器的驱动程序:和pinctrl的交互使用

往期内容 本专栏往期内容: Pinctrl子系统和其主要结构体引入Pinctrl子系统pinctrl_desc结构体进一步介绍Pinctrl子系统中client端设备树相关数据结构介绍和解析inctrl子系统中Pincontroller构造过程驱动分析:imx_pinctrl_soc_info结构体Pinctrl子系统中c…

toolkit二次开发学习之程序集(ProAsmcomp)和装配体组件路径对象(ProAsmcomppath)

程序集ProAsmcomp可以理解为装配体组件对象。 对象ProAssembly是ProSolid的一个实例,并共享相同的声明。因此,ProAssembly对象可以作为适用于装配体的任何ProSolid和ProMdl函数的输入。特别是,因为你可以使用函数ProSolidFeatVisit()来遍历特…

【启程Golang之旅】深入理解 Protocol Buffers 及其应用

如果你是 Go 语言的开发者,理解如何在 Go 中使用 Protobuf,将帮助你大幅提升数据传输的效率,并实现更高性能的系统设计。 本篇文章将深入探讨 Go 语言中使用 Protobuf 的基础知识、常见应用以及最佳实践,带你一步步了解如何在项目…

Intent介绍#1

Intent 它是Android里非常重要的角色,基本上是核心人物。 能做的 startActivity --> 启动activitybroadcastIntent -> BroadcastContext.startService(Intent) Context.bindService(Intent, BindServiceFlags, Executor, ServiceConnection) -> Service…

鸿蒙开发案例:七巧板

【1】引言(完整代码在最后面) 本文介绍的拖动七巧板游戏是一个简单的益智游戏,用户可以通过拖动和旋转不同形状的七巧板块来完成拼图任务。整个游戏使用鸿蒙Next框架开发,利用其强大的UI构建能力和数据响应机制,实现了…

(61)使用LMS算法估计线性预测器并计算估计误差的MATLAB仿真

文章目录 前言一、仿真说明二、仿真代码三、仿真结果1.LMS自适应滤波器权向量更新曲线2.LMS自适应滤波器算法学习曲线3.期望信号与LMS自适应滤波器输出信号 前言 本文介绍了LMS自适应滤波器对线性预测器系统权系数的估计,进行100次独立实验,计算平均估计…

313页电力集团大数据应用支撑平台技术支撑服务项目技术投标方案

▲关注智慧方案文库,学习9000多份最新解决方案,其中 PPT、WORD超过7000多份 ,覆盖智慧城市多数领域的深度知识社区,稳定更新4年,日积月累,更懂行业需求。 313页Word大型电力集团大数据应用支撑平台 技术支…

6款IntelliJ IDEA插件,让Spring和Java开发如虎添翼

文章目录 1、SonarLint2、JRebel for IntelliJ3、SwaggerHub插件4、Lombok插件5、RestfulTool插件6、 Json2Pojo插件7、结论 对于任何Spring Boot开发者来说,两个首要的目标是最大限度地提高工作效率和确保高质量代码。IntelliJ IDEA 是目前最广泛使用的集成开发环境…

标准IO的应用

1、使用这fscanf和fprintf两个函数实现文件的拷贝。 #include<myhead.h> int main(int argc, const char *argv[]) {FILE *fp;if((fpfopen("./1.txt","w"))NULL){perror("fopen");return -1;}int num100;printf("num%d\n",num…