赞
踩
(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交替访问内存。
(input/output memory management unit,输入输出内存管理单元)。这是一种硬件设备,提供DMA地址转换和设备隔离功能,因此只允许特定设备执行进出特定内存区域(由IOMMU指定)的DMA事务,而不能访问指定访问之外的系统内存地址空间。
由于IOMMU的参与,硬件使用的物理地址可能不是真实的物理地址,而是IOMMU分配给硬件的(完全任意的)输入输出虚拟地址(IOVA)。(I/O virtual address)
硬件不能识别用户空间虚拟地址;它使用的是IO地址——物理地址(PA)或IO虚拟地址(IOVA)。
IOMMU,其主要功能链接DMA-capable I/O总线和系统内存。传统的内存管理单元MMU,是将CPU-visible的虚拟地址转换成物理地址,而IOMMU则是将Device-visible的虚拟地址转换成物理地址:
iommu_get_domain_for_dev()
https://blog.csdn.net/denglin12315/article/details/119734412
一、增强了安全性:1)增加了Device对地址空间的访问控制;2)创建I/O保护域;
二、增强了可靠性:1)Device之间是独立,互不干扰;2) 保护系统内存不被不明的Device读/写。
方式一:将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
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。