DPDK系列第六篇:IOVA前期知识 DMA、IOMMU概念及关联

本文介绍了DPDK系列中的IOMMU相关知识,包括DMA的工作原理、三种传输模式以及IOMMU在内存管理和虚拟化环境中的作用,重点讲解了IOMMU如何解决DMA安全性和内存访问问题,以及在虚拟化场景下的隔离应用。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

系列文章

DPDK 系列第一篇: DPDK架构阐述-CSDN博客

DPDK 系列第二篇:CPU Cache详解及DPDK在Cache方面的性能应用-CSDN博客

DPDK 系列第三篇:CPU 亲和性及实际应用-CSDN博客

DPDK 系列第四篇:TLB和大页-CSDN博客

DPDK 系列第五篇:基于大页的内存管理 (内附整理的全内存数据结构关联图,全网无第二份)-CSDN博客

本文目的

        因为打算分析DPDK的IOVA模式,期间会设计到IOMMU等概念,所以提前总结一篇IOMMU相关知识点文字,便于理解。

DMA是什么      

        DMA:直接内存访问 , 是一种允许输入/输出 (I/O) 设备直接向主内存发送或接收数据的方法,绕过 CPU 以加快内存操作。该过程由称为 DMA 控制器 (DMAC) 的芯片管理(ISA设备需要DMA控制器,PCI设备不需要单独的DMA控制器)。内存中用于与外设交互数据的一块区域称为DMA缓冲区,在设备不支持scatter/gather(分散/聚集,简 称SG)操作的情况下,DMA缓冲区在物理上必须是连续的。

       如果没有 DMA 通道,CPU 会使用 I/O 设备的外设总线复制每条数据。使用外设总线在读/写过程中会占用 CPU,并且在操作完成之前不允许执行其他工作。借助 DMA,CPU 可以在执行数据传输时处理其他任务。数据传输首先由 CPU 启动。DMAC可以通过三种方式将数据块传输到内存或从内存传输数据块。

DMA的三种传输方式

        突发模式:只有在数据传输完成后才会释放系统总线。在突发模式下,整个数据块以一个连续的顺序传输。一旦 CPU 授予 DMA 控制器访问系统总线的权限,它就会传输数据块中的所有字节数据,然后再将系统总线的控制权释放回 CPU,但会使 CPU 在相对较长的时间内处于非活动状态。该模式也称为“块传输模式”。

        周期窃取模式: 用于在突发传输模式所需的时间长度内不应禁用 CPU 的系统中。在周期窃取模式下,DMA 控制器以与突发模式相同的方式获取对系统总线的访问,使用 BR(总线请求)和 BG(总线授予)信号,这是控制 CPU 和 DMA 控制器之间接口的两个信号。然而,在周期窃取模式下,在一个单位(例如字节)数据传输后,系统总线的控制权通过BG解除给CPU。然后通过 BR 不断再次请求它,每个请求传输一个单位(例如字节)的数据,直到整个数据块被传输完毕。通过不断获取和释放对系统总线的控制,DMA控制器基本上将指令和数据传输交错在一起。CPU 处理一条指令,然后 DMA 控制器传输一个数据值,依此类推。数据传输速度不快,但 CPU 不会像在突发模式下那样长时间处于空闲状态。周期窃取模式对于实时监控数据的控制器非常有用。

        透明模式:DMAC只有在处理器不需要系统总线时才能负责系统总线。透明模式传输数据块所需的时间最多,但就整体系统性能而言,它也是最有效的模式。在透明模式下,DMA 控制器仅在 CPU 执行不使用系统总线的操作时传输数据。透明模式的主要优点是 CPU 永远不会停止执行其程序,并且 DMA 传输在时间上是免费的,而缺点是硬件需要确定 CPU 何时不使用系统总线,这可能很复杂。这也称为“隐藏的 DMA 数据传输模式”。

        与ISA设备不同的是,PCI设备架构中并不存在DMA控制器,任何一个PCI设备都可以向PCI总线控制器发起总线请求,获得对总线的控制权。PCI设备发起DMA的过程是由操作系统中的设备驱动程序访问与DMA操作相关的特定硬件寄存器组实现的。设备驱动不仅可以通过写入相关硬件寄存器设置DMA操作的目的地址,而且可以通过向DMA命令寄存器写入DMA命令发起DMA请求。

IOMMU是什么

        如下图,在计算中,输入输出内存管理单元 (IOMMU) 是将支持直接内存访问(DMA)的 I/O 连接到主内存的 内存管理单元 (MMU)。与将 CPU 可见的虚拟地址转换为物理地址的传统 MMU 一样,IOMMU 将设备可见的虚拟地址(也称为设备地址或内存映射 I/O 地址 或IOVA)映射到物理地址。一些设备还提供内存保护,防止故障或恶意设备。

IOMMU和DMA的关系

        IOMMU的作用就是限制或扩展DMA可操作的物理内存范围,对DMA做地址翻译,用来解决DMA的安全性问题。从如下内核i40e驱动 中dma 映射基本可以看到iommu和dma的调用关系。

dma_ops = &intel_dma_ops;
i40e_alloc_mapped_page
  └─dma_map_page
      └─intel_map_page
          └─__intel_map_single
              ├─if(iommu_no_mapping) return paddr;
              ├─intel_alloc_iova
              └─domain_pfn_mapping

​IOMMU相较于纯DMA的优势

1、可以分配大块的内存而无需在物理内存中连续分配 - IOMMU将连续的虚拟地址映射到底层的碎片化物理地址。因此,有时可以避免使用SG,上边DMA我们讲到在设备不支持scatter/gather(分散/聚集,简 称SG)操作的情况下,DMA缓冲区在物理上必须是连续的。

2、如果外设设备不支持足够长的内存地址以访问整个物理内存,仍然可以通过IOMMU访问整个内存,避免将缓冲区复制到外设的可寻址内存空间或从外设的可寻址内存空间复制缓冲区相关的开销。
        例如,x86计算机可以通过x86处理器中的物理地址扩展(PAE)功能访问超过4GB的内存。然而,一个普通的32位PCI设备根本无法访问4GB边界以上的内存,因此它无法直接访问它。如果没有IOMMU,操作系统将不得不实现耗时的弹性缓冲区(也称为双缓冲区)。

3、通过IOMMU,设备无法读取或写入未明确为其分配(映射)的内存,所以可以防止内存受到恶意设备的DMA攻击和故障设备的错误内存访问。能提供内存保护是因为MMU和IOMMU 只受运行在CPU上的操作系统控制。

4、在虚拟化中,虚拟机的操作系统可以一些方式访问主机的硬件外设。当操作系统在虚拟机(包括使用半虚拟化的系统(如 Xen 和 KVM))中运行时,它通常不知道它访问的内存的主机物理地址。这使得提供对主机硬件的直接内存访问(DMA)变得困难,因为如果虚拟机操作系统尝试指示硬件使用客户机物理地址执行直接内存访问 (DMA),则可能会损坏主机系统内存,因为硬件不知道给定虚拟机的客户机物理地址和主机物理地址之间的映射。如果虚拟机监控程序或主机操作系统介入 I/O 操作以应用转换,则可以避免损坏。但是,此方法会导致 I/O 操作延迟。IOMMU处理此重新映射,允许在VM操作系统中使用HOST设备驱动程序。

5、在某些体系结构中,IOMMU还执行硬件中断重新映射,类似于标准内存地址重新映射。

6、IOMMU 可以支持外设内存分页。使用 PCI-SIG PCIe 地址转换服务 (ATS) 页面请求接口 (PRI) 扩展的外设可以检测内存管理器服务的需求并发出信号。

IOMMU的缺点

1、翻译和管理开销(例如,页表遍历)会在一定程度上降低性能。

2、添加的 I/O 页(转换)表的物理内存消耗。如果可以与处理器共享表,则可以缓解这种情况。

3、为了减小页表大小,许多 IOMMU 的粒度等于内存分页(通常为 4096 字节),因此,在对设备可见之前,必须对每个需要防止 DMA 攻击的小缓冲区进行页面对齐和归零。由于操作系统内存分配的复杂性,这意味着设备驱动程序需要对敏感数据结构使用退回缓冲区,从而降低整体性能

总结

        在虚拟化出现之前, iommu硬件主要功能就是将iova(IO总线地址)转换成hpa(主机物理地址),它的出现主要解决了两个问题。一个是让只有32位DMA能力的设备能够访问大于4G以上的内存地址空间,另外一个就是可以把多个分散的dma操作聚合成一个连续的DMA操作。举个例子,驱动程序可能分配两个大小为4KB的且在物理内存地址上不连续的buffer,那么通过dma_map_sgtable这样的api可以直接把它们合并成一个8KB的在iova上是连续的DMA操作,这样一来原来需要两次DMA操作现在只需要一次操作就搞定了。

        随着虚拟化技术在数据中心大规模地使用,iommu的主要作用也由原来单方面的转换功能变成了转换加隔离。在sriov场景iommu的隔离作用主要体现在避免直通给不同虚拟机外设 DMA错误物理内存。

        如果设置为iommu=pt,则iommu_pass_through设置为1,相应的驱动中的iommu_identify_mapping会设置为IDENTMAP_ALL。在这种场景下,系统会通过si_domain_init创建一个全局的dmar_domain(可以理解它存储了所有的address translation的页表),si表示的是static即静态的,之所以说是静态的是因为si_domain会把每个node上的内存提前建立好iova到hpa的mapping。然后再把每个iommu下面挂着的设备跟si_domain关联起来。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值