全系列文章链接

Linux x86-64 IOMMU详解(一)——IOMMU简介
Linux x86-64 IOMMU详解(二)——SWIOTLB(软件IOMMU)
Linux x86-64 IOMMU详解(三)——Intel IOMMU(硬件IOMMU)的功能与基本原理
Linux x86-64 IOMMU详解(四)——启用Intel IOMMU的配置
Linux x86-64 IOMMU详解(五)——Intel IOMMU初始化流程
Linux x86-64 IOMMU详解(六)——Intel IOMMU参与下的DMA Coherent Mapping流程

前言

近期所做的项目,与Linux内核的IOMMU机制有关,因此自己尝试去了解IOMMU的相关知识。我在网上多方查找,却总觉得是盲人摸象,难以形成一套系统化的知识体系。并且,许多代码是基于Linux v2.x、v3.x内核,而我当前项目是基于较新的Linux 5.5.4内核,有一些代码,乃至实现机制,都发生了根本性的变化。最终,还是决定自己研究代码,终于明白了IOMMU的初始化流程。现撰文分享,希望之后还有同行遇到此类问题时,能够参考本文,节约学习成本。
本系列包含多篇文章,分别介绍IOMMU的基本概念、软件IOMMU(SWIOTLB)、硬件IOMMU(Intel IOMMU),以及IOMMU的初始化流程。
本系列全部文章均可转载,转载时标明原作者即可。

适用环境

内核版本:Linux 5.5.4(Linux 5.x版本应该都适用)
硬件:Intel x86-64处理器;对于硬件IOMMU的章节,要求BIOS能够支持Intel IOMMU

IOMMU简介

关于IOMMU,网上的资料分析得比较详细,此处仅作简要介绍,以作为后续文章的引子。
IOMMU (Input and Output Memory Management Unit),其名称显然是由MMU衍生而来。之所以二者名称如此相似,是因为它们的功能非常相似。以下是一张解释IOMMU功能的经典图片:

从上图中不难看出,IOMMU是DMA(直接内存访问,即设备与内存直接通信,而无需经过CPU)过程中的一个环节。本系列的文章更多时候会把IOMMU看作一种机制,从这个角度,我们也可以说:IOMMU是DMA的一种实现方式。
愿意阅读本文的读者,相信对于MMU并不陌生:MMU是将CPU虚拟地址转换为内存物理地址的硬件单元。类似地,IOMMU是将设备地址(又称总线地址)转换为内存物理地址的单元。我们完全可以参照虚拟内存机制,来理解IOMMU的作用:
① IOMMU使得设备无法直接访问物理地址,大大增加了设备进行DMA攻击的难度。
② 部分设备的引脚数较少,导致其位数较低,无法寻址到整个物理内存空间。以目前主流的32位设备为例,其在物理内存中直接寻址的范围是[0, 4GB)。但是,现代操作系统的内存往往大于4GB。如果设备申请DMA时,内核为设备分配的DMA buffer的地址高于4GB(以下简称为“high buffer”),则设备将无法寻址到它。
有了IOMMU以后,IOMMU就可以在[0, 4GB)范围内分配一段与高地址buffer长度相同的内存,让设备能够直接寻址(以下称为“low buffer”)。设备向low buffer写入后,IOMMU就会将low buffer中的内容,复制到high buffer,而后通知CPU从high buffer读取内容。反之亦然——CPU向high buffer写入后,IOMMU就会将high buffer中的内容,复制到low buffer,而后通知设备从low buffer读取内容。这样,CPU和设备都能读取到对方写入的内容。这样在high buffer和low buffer之间复制内容的操作,在IOMMU机制中被称为“sync”或“bounce”。

Linux x86-64 IOMMU详解(一)——IOMMU简介相关推荐

  1. linux中top指令,Linux下top命令详解

    原标题:Linux下top命令详解 1.简介 top命令是Linux下常用的性能分析工具,能够实时显示系统中各个进程的资源占用状况,类似于Windows的任务管理器.top显示系统当前的进程和其他状况 ...

  2. 【正点原子Linux连载】第三十五章 Linux内核顶层Makefile详解 -摘自【正点原子】I.MX6U嵌入式Linux驱动开发指南V1.0

    1)实验平台:正点原子阿尔法Linux开发板 2)平台购买地址:https://item.taobao.com/item.htm?id=603672744434 2)全套实验源码+手册+视频下载地址: ...

  3. linux网络命名空间详解,Linux Network Namespace (netns) 详解

    Linux Network Namespace (netns) 详解 Network Namespace (以下简称netns)是Linux内核提供的一项实现网络隔离的功能,它能隔离多个不同的网络空间 ...

  4. 《Linux设备驱动开发详解 A》一一2.3 接口与总线

    本节书摘来华章计算机出版社<Linux设备驱动开发详解 A>一书中的第2章,第2.3节,作者:宋宝华 更多章节内容可以访问云栖社区"华章计算机"公众号查看.1 2.3 ...

  5. linux的strace命令(详解)

    linux的strace命令(详解) 本文详细讲述linux下的strace命令的用法. strace 命令是一种强大的工具,它能够显示所有由用户空间程序发出的系统调用. strace 显示这些调用的 ...

  6. 8.Linux的LVM使用详解

    8.Linux的LVM使用详解 命令概览:所使用的命令(#代表是数字) pvcreate /dev/sd[xx] vgcreate -s # vgname /dev/sd[] -s 指定PE的大小   ...

  7. linux下DNS配置详解

    linux下DNS配置详解 DNS 是域名系统 (Domain Name Server) 的缩写,该系统用于命名组织到域层次结构中的计算机和网络服务.在Internet上域名与IP地址之间是一一对应的 ...

  8. linux看不到进程管理,关于Linux下进程的详解【进程查看与管理】

    关于Linux下进程的详解[进程查看与管理] 一.关于进程 进程: 已经启动的可执行程序的运行实力 进程的组成:一个进程包含内核中的一部分地址空间和一系列数据结构.其中地址空间是内核标记的一部分内存以 ...

  9. linux命令之-dmesg详解

    Linux命令dmesg用法详解 功能说明:显示开机信息.  语 法:dmesg [-cn][-s <缓冲区大小>]  补充说明:kernel会将开机信息存储在ring buffer中.您 ...

  10. Linux下的时间详解【转】

    Linux下的时间详解 [转载]http://www.fangshanzi.com/linux-time-function-detail/ 1.首先来总结一下hwclock,这个容易晕: 1)/etc ...

最新文章

  1. 静态方法、类方法、属性方法
  2. 大白话系列之C#委托与事件讲解大结局
  3. Apache Kylin权威指南1.3 Apache Kylin的工作原理
  4. tensorflow怎样调用gpu_tensorflow / tensorflow-gpu / tensorflow-cpu区别?
  5. mPaaS 月度小报|为采购而生,全新资源包上架;前端 2D 游戏化互动入门指南
  6. 云服务器维护人员,云服务器维护工作难吗
  7. 利用代码生成right scope数据
  8. 2017下半年网络规划设计师考试上午真题
  9. 修改jar 注入_Apache Tika命令注入漏洞挖掘
  10. java消除整型数组中重复的元素,排序后输出新数组
  11. Hadoop安装教程 Mac版
  12. 安全管家安卓_网速管家安卓5.4版本全面上线,多场景网络体验全面升级
  13. php初级程序员的自我评价,程序员的自我评价【程序员的简历自我评价】
  14. 非诚勿扰:比舒淇更孤单的是谁?
  15. centos5.6安装mysql_centos安装mysql5.6
  16. ads1278_24位高性能模数转换器ADS1274/ADS1278及其应用
  17. android nfc扇区加密,android NFC MifareClassic 读IC卡加密扇区方法
  18. 计算机毕业设计_基于SSM的医院预约挂号系统设计与实现
  19. Svn 命令行工具 操作 SVN 服务器
  20. 数据中台推不动?手把手教你落地搭建!

热门文章

  1. 计算机专业考注册测绘师经验,2017年注册测绘师考试知识点整理:测绘综合能力--摄影测量与遥感...
  2. 用友NCCloud2021.11 专项漏洞补丁列表
  3. MySQL5.5安装包 安装详解
  4. 孪生网络 应用_数字孪生在航空发动机制造工艺中的应用探索
  5. 安装moodle3.6
  6. chrome升级后无高级-断续访问
  7. ubuntu22.04编译opengl编程指南示例
  8. 仿layui风格漂亮easyui主题皮肤美化
  9. Gallery3D笔记
  10. Mac M1 百度网盘客户端无法打开,网络连接不上