DMA和IOMMU概念理解

DMA

(Direct Memory Access,直接存储器访问)它允许不同速度的硬件装置来沟通,而不需要依赖于CPU的大量中断负载。
DMA 传输将数据从一个地址空间复制到另外一个地址空间。当CPU 初始化这个传输动作,传输动作本身是由 DMA 控制器来实行和完成。
在实现DMA传输时,是由DMA控制器直接掌管总线,因此,存在着一个总线控制权转移问题。即DMA传输前,CPU要把总线控制权交给DMA控制器,而在结束DMA传输后,DMA控制器应立即把总线控制权再交回给CPU。一个完整的DMA传输过程必须经过DMA请求、DMA响应、DMA传输、DMA结束4个步骤。
DMA技术的出现,使得外围设备可以通过DMA控制器直接访问内存,与此同时,CPU可以继续执行程序。那么DMA控制器与CPU怎样分时使用内存呢?通常采用以下三种方法:(1)停止CPU访问内存;(2)周期挪用;(3)DMA与CPU交替访问内存。

IOMMU

(input/output memory management unit,输入输出内存管理单元)。这是一种硬件设备,提供DMA地址转换和设备隔离功能,因此只允许特定设备执行进出特定内存区域(由IOMMU指定)的DMA事务,而不能访问指定访问之外的系统内存地址空间
由于IOMMU的参与,硬件使用的物理地址可能不是真实的物理地址,而是IOMMU分配给硬件的(完全任意的)输入输出虚拟地址(IOVA)。(I/O virtual address)
硬件不能识别用户空间虚拟地址;它使用的是IO地址——物理地址(PA)或IO虚拟地址(IOVA)。

IOMMU和MMU的区别

IOMMU,其主要功能链接DMA-capable I/O总线和系统内存。传统的内存管理单元MMU,是将CPU-visible的虚拟地址转换成物理地址,而IOMMU则是将Device-visible的虚拟地址转换成物理地址:
DMA和IOMMU概念理解_第1张图片

IOMMU地址转换原理

iommu_get_domain_for_dev()
https://blog.csdn.net/denglin12315/article/details/119734412

采用 IOMMU的好处

一、增强了安全性:1)增加了Device对地址空间的访问控制;2)创建I/O保护域;
二、增强了可靠性:1)Device之间是独立,互不干扰;2) 保护系统内存不被不明的Device读/写。

关闭IOMMU的方式

方式一:将iommu 给彻底给bypass掉,linux 提供了iommu.passthrough command line的选项,这个选项配置上后,dma 默认不会走iommu,而是走传统的swiotlb方式的dma;缺点是效率较低
https://blog.csdn.net/liuhangtiant/article/details/87825466 Linux swiotlb技术解析

方式二:smmu v3的驱动默认支持驱动参数配置,disable_bypass,在系统中是默认关闭bypass的,我们可以通过这个来将某个smmu给bypass掉;

方式三:acpi 或者dts中不配置相应的smmu节点,比较粗暴的办法。

原文链接:https://blog.csdn.net/Rong_Toa/article/details/108997226

参考链接:
https://blog.csdn.net/mathstar/article/details/24435097?utm_medium=distribute.pc_relevant.none-task-blog-2~default~CTRLIST~default-1.no_search_link&depth_1-utm_source=distribute.pc_relevant.none-task-blog-2~default~CTRLIST~default-1.no_search_link

https://blog.csdn.net/hotsolaris/article/details/1731870?utm_medium=distribute.pc_relevant.none-task-blog-2~default~CTRLIST~default-1.no_search_link&depth_1-utm_source=distribute.pc_relevant.none-task-blog-2~default~CTRLIST~default-1.no_search_link

你可能感兴趣的:(linux,嵌入式开发,嵌入式开发,linux)