Linux DMA mapping机制分析

468次阅读  |  发布于2年以前

背景

说明:

1 . Kernel版本:4.14

2 . ARM64处理器,Contex-A53,双核

3 . 使用工具:Source Insight 3.5, Visio

1 . 概述

DMA(Direct Memory Access):直接存储器访问;

先看问题的引入:

2 . address mapping

DMA涉及三种地址空间:

CPU与Device看待地址的空间不一样,看几个示例:

1 . A:Host bridge负责将Bus address映射到CPU的物理地址空间,可以通过ioremap 来使用,比如PCI/PCIe;

2 . B:设备使用的总线地址,可以通过IOMMU访问到CPU的物理地址空间,由IOMMU来负责映射;

3 . C:设备使用的总线地址与CPU的物理地址相同,不需要使用IOMMU进行地址转换;

2.1 cache coherence

DMA的操作,通常与cache相关,先了解一下cache coherence:

3 . DMA mappings

Linux内核中提供了两种dma mapping的接口:Consistent mapping和Stream mapping。

3.1 Consistent DMA mappings

通常在使用consistent dma mapping时,首先需要通过dma_alloc_coherent接口来分配一段区域:

3.1 device reserved

通常,可以为设备指定专用的dma coherent的区域,有以下的方式:

  1. 通过在设备树中添加对应的属性值,驱动中可以调用of_reserved_mem_device_init最终完成dma区域的注册;
  2. 直接通过接口dma_decleare_coherent_memory调用来进行注册;

3.2 dma pool

驱动中经常面临buffer的管理,可以使用dma pool机制来处理,大概的原理如下:

3.2 Streaming DMA mappings

先看一下数据一致性问题:

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