Read the fucking source code!
--By 鲁迅A picture is worth a thousand words.
--By 高尔基说明:
1 . Kernel版本:4.14
2 . ARM64处理器,Contex-A53,双核
3 . 使用工具:Source Insight 3.5, Visio
DMA(Direct Memory Access):直接存储器访问;
先看问题的引入:
DMA涉及三种地址空间:
CPU与Device看待地址的空间不一样,看几个示例:
1 . A:Host bridge负责将Bus address映射到CPU的物理地址空间,可以通过ioremap
来使用,比如PCI/PCIe;
2 . B:设备使用的总线地址,可以通过IOMMU访问到CPU的物理地址空间,由IOMMU来负责映射;
3 . C:设备使用的总线地址与CPU的物理地址相同,不需要使用IOMMU进行地址转换;
DMA的操作,通常与cache相关,先了解一下cache coherence:
Linux内核中提供了两种dma mapping的接口:Consistent mapping和Stream mapping。
通常在使用consistent dma mapping时,首先需要通过dma_alloc_coherent
接口来分配一段区域:
dma_alloc_coherent
用于分配coherent内存,并返回对应的虚拟地址;通常,可以为设备指定专用的dma coherent的区域,有以下的方式:
of_reserved_mem_device_init
最终完成dma区域的注册;dma_decleare_coherent_memory
调用来进行注册;驱动中经常面临buffer的管理,可以使用dma pool机制来处理,大概的原理如下:
dma_sync_XXX()
函数);先看一下数据一致性问题:
dma_map_single
函数如下:
dma_unmap_single
是逆操作:
从上述函数中可以看到,最终都会调用到arch相关的cache操作,这个与体系结构是强相关的,以arm64为例:
收工了!
Dynamic DMA mapping Guide
Cache coherence
CoreLink CCI-550
Copyright© 2013-2020
All Rights Reserved 京ICP备2023019179号-8