解析Linux DMA mapping机制

news2024/11/17 14:39:13

说明:

  1. Kernel版本:4.14
  2. ARM64处理器,Contex-A53,双核
  3. 使用工具:Source Insight 3.5, Visio

1. 概述

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

先看问题的引入:

  • Non-DMA:CPU直接与设备进行数据交互,CPU的负载会随着数据的读写而增加;
  • DMA:CPU不参与数据的直接传输,DMA Controller负责Device与Memory之间的数据搬运,并以中断信号的形式通知CPU;
  • 可以看出,使用DMA的最大优点是可以提高CPU的使用率;

 资料直通车:Linux内核源码技术学习路线+视频教程内核源码

学习直通车:Linux内核源码内存调优文件系统进程管理设备驱动/网络协议栈

2. address mapping

DMA涉及三种地址空间:

  • CPU虚拟地址:CPU使用的地址空间;
  • CPU物理地址:CPU使用的虚拟地址通过MMU转换成物理地址;
  • 总线地址:设备使用的地址空间;

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:

  • cache coherence设备:设备之间的读写不需要关心cache的一致性问题,硬件将确保数据一致,比如连接在ARM CCI端口上的设备就是cache coherence设备;
  • non-coherence设备:需要额外的软件操作(flush/invalidate)等操作来确保数据一致;

3. DMA mappings

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

3.1 Consistent DMA mappings

  • consistent mapping:对应于cache-coherence设备,硬件确保device和CPU都能并行访问数据,并能看到彼此的更新,而不需要软件的flush操作;
  • 通常在驱动init时进行map操作,而在deinit时进行unmap操作;

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

  • dma_alloc_coherent用于分配coherent内存,并返回对应的虚拟地址;
  • 进行内存分配时,存在三种方式:1)优先从设备专用的dma池开始分配;2)无专用dma池,如果是dma-direct访问,通过dma_direct_alloc分配,而底层是依赖于CMA来分配;3)使用IOMMU的设备,则通过iommu的操作函数集来分配;

3.2 device reserved

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

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

3.3 dma pool

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

  • dma-pool以页为单位来进行管理分配,可以通过添加多个dma池来使用;
  • dma-pool子系统的细节描述,需要另起一篇文章了;

3.4 Streaming DMA mappings

  • streaming mapping:对应于non-coherence设备;
  • 通常在单次DMA传输时进行map,在传输完成后进行unmap(除非调用了dma_sync_XXX()函数);
  • non-coherence设备,由于buffer不与其他数据共享cache line,通常会work better;

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

  • dma to device时,需要将cache中的数据flush到memory中;
  • dma from device时,需要先将cache中的数据invalidate掉,避免CPU读取的是原来的数据;

dma_map_single函数如下:

  • map操作时存在两种方式,直接映射或使用iommu来完成映射;

dma_unmap_single是逆操作:

从上述函数中可以看到,最终都会调用到arch相关的cache操作,这个与体系结构是强相关的,以arm64为例:

  • 最终的代码将调用到汇编中,操作也较简单,不再赘述了;

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/192454.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

OpenWrt之IPTV双线融合教程

文章目录前言OpenWrt版本1. 让路由与光猫互通2. 设置Vlan3. 配置接口4. 配置路由表5. 播放测试后话前言 前段时间开始, 电信就开始整理单播源传播的乱象, 就限制了非内网无法打开直播源, 于是只能搞搞双线融合了, 让我的RTSP源重新焕发生机 OpenWrt版本 22.02 1. 让路由与光猫…

【docker概念和实践 5】(1) 容器数据卷

一、说明 本文的主要内容 什么是数据卷如何生成数据卷将数据卷挂在容器上多容器如何共享数据卷什么是绑定挂载二、数据卷概念 2.1 数据长久保存的要求 在容器运行时,容器内有一个数据存储空间,但是当容器关闭后,这个存储空间内容将被丢失&…

PYTHON官方教程:Python3.11中文版文档

Python 每年都会发布新版本,上半年是功能锁定的测试版,年底是最终版本。 Python 3.11 的特性集刚刚定稿,测试版本已经发布,开发人员在非生产代码上可以尝试使用这个最新版本,验证它能否在你的程序中工作,并…

小白入门pwn笔记--elf文件概述

笔记是根据哔哩哔哩视频所写2、ELF文件概述_哔哩哔哩_bilibili第一集看过大概,很久之前安装过一些工具,所以直接从第二集开始看,遇到没有安装的工具再安装。从今天开始入坑pwn0.pwn的简单介绍exploit:用于攻击的脚本与方案。paylo…

一、代码随想录算法训练营第一天| 704. 二分查找、27. 移除元素。

数组基础理论数组是存放在连续内存空间上的相同类型数据的集合。数组下标都是从0开始的。数组内存空间的地址是连续的正是因为数组的在内存空间的地址是连续的,所以我们在删除或者增添元素的时候,就难免要移动其他元素的地址。数组的元素是不能删的&…

关于CADC数据集的处理笔记

简要介绍 数据集 Canadian Adverse Driving Conditions Dataset(CADC)是全球首个针对寒冷环境的自动驾驶数据集,其内包含: 56,000 张相机图像;7,000 次 LiDAR 扫描;75 个场景,每个场景 50-100…

Vue中作用域插槽solt详解

作用域插槽插槽可以实现父子组件通信(通信的结构)默认插槽具名插槽作用域插槽:子组件的数据来源于父组件,子组件是决定不了自身结构与外观的直接上代码&#xff01;&#xff01;父组件&#xff1a;<template><div><h2>效果一: 显示TODO列表时, 已完成的TODO为…

蓝桥杯STM32G431RBT6学习——M24C02

蓝桥杯STM32G431RBT6学习——M24C02 前言 IIC是单片机的通用协议&#xff0c;在蓝桥杯单片机、嵌入式中都是考点。国信长天开发板板载M24C02&#xff08;IIC驱动&#xff09;作为调电存储模块&#xff0c;可以通过IIC对其写入数据后&#xff0c;掉电进行保存以供读取。其硬件…

Linux(centos7)基本操作---进程管理

进程管理进程管理&#xff08;process&#xff09;相关的名词解释静态进程查看动态进程查看进程控制作业管理&#xff08;jobs&#xff09;文件虚拟系统&#xff08;proc&#xff09;进程管理&#xff08;process&#xff09; 相关的名词解释 PID&#xff1a;进程的身份证号,…

对象之间的拷贝与转换

这里写目录标题Lambda 的 builderidea 自动生成插件 GenerateAllSetterMapStructDozer在开发的时候经常会有业务代码之间有很多的 JavaBean 之间的相互转化&#xff0c;比如 PO/DTO/VO/QueryParam 之间的转换问题&#xff0c;本文总结一下各种转换方法Lambda 的 builder 使用构…

【Qt】11.Linux下,Qt程序打包

目录 获取Release模式下的可执行文件 打包的目录结构搭建 安装linuxdeployqt 环境准备 下载linuxdeployqt 编译安装 复制快捷方式 配置环境变量 使生效 查看版本 安装unixODBC库 解压 配置 编译安装 重启系统 打包 原因 解决方法 打成deb包 打deb包目录构建…

Python虚拟环境大总结(virtualenv pipenv)

文章目录1 virtualenv1.1 安装1.2 测试安装是否成功1.3 主要命令1.4 virtualenvwrapper1.4.1 创建虚拟环境1.4.2 列举所有虚拟环境1.4.3 激活虚拟环境1.4.4 取消激活虚拟环境1.4.5 删除虚拟环境1.4.6 创建指定版本的虚拟环境2 pipenv2.1 安装2.2 创建虚拟环境2.3 进入虚拟环境2…

游戏之外,元宇宙也在寻求与更多领域进行融合

在大众对元宇宙的构想中&#xff0c;“游戏”是优先级最高的落地场景之一。《头号玩家》、《赛博朋克2077》等作品中&#xff0c;“游戏”也多次成为元宇宙的主要载体&#xff0c;描画出人们对于这一前沿风口的想象。 2022年以来&#xff0c;监管侧陆续传来元宇宙产业发展的利…

python算法加密 pyarmor与docker

如觉得博主文章写的不错或对你有所帮助的话&#xff0c;还望大家多多支持呀&#xff01;关注、点赞、收藏、评论。 目录一、 基本语法 加密 Python 脚本二、运行加密脚本三、pyarmor&docker3.1 Dockerfile3.2 requirements.txt3.3 加密函数lock_by_pyarmor.py3.4 主函数myp…

元宵节营销活动策划,轻松拿下用户

热闹的春节刚过&#xff0c;又将迎来团圆美满的元宵节&#x1f3ee;。我们今天就来讲讲&#xff0c;关于节日营销的小巧思&#xff01; 【产品游戏】 在每一个关于节日的营销里&#xff0c;将游戏作为切入点与产品相结合&#xff0c;往往可以获得意想不到的效果。对于场景单一…

DynaSLAM-6 DynaSLAM论文解读

目录 1.论文摘要解读 1.1 原论文内容 1.2 个人理解 2.论文discusses related work部分 2.1 原论文内容 3.论文SYSTEM DESCRIPTION部分 3.1 使用Mask R-CNN对潜在的动态内容进行分割 3.2 低成本追踪 3.3 使用Mask R-CNN和多视角几何对动态内容进行分割 3.4 跟踪线程…

分享会上狂吹MySQL的4大索引结构红黑树、二叉树B+Tree,没想到~~~~

索引&#xff08;index&#xff09;是帮助MySQL高效获取数据的数据结构(有序)。在数据之外&#xff0c;数据库系统还维护着满足 特定查找算法的数据结构&#xff0c;这些数据结构以某种方式引用&#xff08;指向&#xff09;数据&#xff0c; 这样就可以在这些数据结构 上实现高…

品优购网页制作

目录 favicon图标 TDK三大标签SEO优化 title网站标题 description网站说明 keywords关键字 首页制作 快捷导航模块 左浮动 右浮动 header头部模块制作 1.logo模块 2.search模块 3.热词模块 4.购物车模块 子绝父绝 nav导航模块 1.nav左边导航位置 2.上方导航位置 …

PCB覆铜很“上头”?一文帮你搞定实操要点和规范

1、覆铜覆盖焊盘时&#xff0c;要完全覆盖&#xff0c;shape 和焊盘不能形成锐角的夹角。2、尽量用覆铜替代粗线。当使用粗线时&#xff0c;过孔通常为非通常走线过孔&#xff0c;增大过孔的孔径和焊盘。修改后&#xff1a;3、尽量用覆铜替换覆铜走线的模式&#xff0c;后者常常…

11.深度优先搜索

一、算法内容 1.简介 深度优先搜索DFS&#xff08;Depth First Search&#xff09;按照深度优先的方式进行搜索&#xff0c;可以理解为“一条路走到黑”地穷举所有可行的方案&#xff0c;并不断尝试&#xff0c;直到找到一种情况满足问题问题的要求。那么这个方案就是一个问题…