浅析Linux设备驱动:DMA内存映射

news2024/11/15 12:56:57

文章目录

    • 概述
    • DMA与Cache一致性
    • DMA映射类型
    • 一致性DMA映射
      • dma_alloc_coherent
    • 流式DMA映射
      • dma_map_single
      • 数据同步操作
        • dma_direct_sync_single_for_cpu
        • dma_direct_sync_single_for_device
    • 相关参考

概述

现代计算机系统中,CPU访问内存需要经过Cache,但外部设备通常不感知Cache的存在,因此CPU和外设在访问DMA内存时,必须谨慎处理内存数据的一致性问题。为了处理这种一致性问题,同时为了兼顾多种设备类型,Linux系统会采用不同的规则来映射DMA内存,开发者遵循这套规则对DMA内存进行操作。

DMA与Cache一致性

DMA内存中的数据会涉及到CPU和设备的共同访问,区别在于CPU通常经过Cache访问内存,但常规的设备通常不会感知Cache的存在。因此,CPU写入的数据可能因为还存在Cache中而未及时刷入内存,从而导致设备没有DMA到最新的数据;反过来,设备已经向设备DMA了新的数据,但CPU可能仍然在使用Cache中旧的数据。
在这里插入图片描述
解决这种DMA与Cache间数据一致性的方法通常有两种,一种是设备硬件支持Cache一致性协议;另外一种就是软件通过同步操作来保证数据一致性。根据硬件是否支持Cache一致性,可以将设备分成两类:

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

DMA映射类型

Linux系统支持两种DMA映射类型:一致性DMA映射(Consistent DMA Mapping)和流式DMA映射(Streaming DMA Mapping)。二者的核心差异在于:

  • 一致性DMA映射情况下,无论是CPU还是设备,在访问DMA内存时,全程都不使用Cache,从而避免数据一致性问题;
  • 流式DMA映射则只在DMA传输数据时,通过软件操作来处理Cache的同步,以减轻关闭Cache对性能的影响。

一致性DMA映射

一致性DMA映射本质上是利用了硬件的支持,禁用了DMA内存缓存区的Cache功能。 CPU和DMA controller在发起对DMA缓冲区的并行访问的时候不需要考虑cache的影响,也就是说不需要软件进行Cache操作,CPU和DMA controller都可以看到对方对DMA缓冲区的更新。

dma_alloc_coherent

DMA一致性映射使用dma_alloc_coherent接口来分配DMA内存,实现流程如下:
在这里插入图片描述
dma_alloc_cohrent通过几种不同的方式分配DMA内存:

  1. 优先从Device Cohorent Pool申请内存,这是设备专用的DMA内存池;
  2. 若设备使用直接映射,通过dma_direct_alloc分配内存;
  3. 若设备使用IOMMU,通过IOMMU提供的操作接口分配内存。

流式DMA映射

流式DMA映射是一次性的,一般是需要进行DMA传输的时候才进行mapping,一旦DMA传输完成,就立刻ummap,或者使用dma_sync_*接口进行同步,并且硬件可以为顺序化访问进行优化。流式DMA映射是怎么保证数据一致性的呢,它的方式更加复杂,让我们从数据的两个方向来分析:

  • DMA_TO_DEVICE:CPU将数据写入cache,然后同步cache与RAM(映射区域),同步操作完成后设备再从RAM(映射区域)获取数据;
  • DMA_FROM_DEVICE:CPU标记RAM(映射区域)对应的cache line为无效状态,以避免设备将数据写入RAM(映射区域)后,CPU从cache中获得"脏数据"。

流式DMA映射根据数据方向对cache进行"flush/invalid",既保证了数据一致性,也避免了完全关闭cache带来的性能影响。
在这里插入图片描述

dma_map_single

DMA流式映射使用dma_map_single或dma_map_sg接口映射DMA内存,其中dma_map_sg支持Scantter/Gathter的处理,这里以dma_map_single接口说明DMA内存的申请流程:
在这里插入图片描述
dma_map_single支持两种方式映射DMA内存:

  • 直接映射方式,底层使用SWIOTLB机制实现;
  • 设备支持IOMMU,通过IOMMU提供的操作接口映射内存。

数据同步操作

DMA流式映射提供了两个接口:dma_direct_sync_single_for_cpu和dma_direct_sync_single_for_device,用于完成DMA内存数据的同步。

dma_direct_sync_single_for_cpu

如果你需要多次访问同一个流式映射DMA缓冲区,并且在DMA传输之间读写DMA缓冲区上的数据,这时候你需要使用dma_sync_single_for_cpu进行DMA缓冲区的sync操作,以便CPU和设备可以看到最新的、正确的数据。
在这里插入图片描述

dma_direct_sync_single_for_device

如果CPU操作了DMA缓冲区的数据,然后你又想让硬件设备访问DMA缓冲区,这时候,在真正让硬件设备去访问DMA缓冲区之前,你需要调用dma_direct_sync_single_for_device接口以便让硬件设备可以看到cpu更新后的数据。
在这里插入图片描述

相关参考

  • Dynamic DMA mapping guide
  • 扒开DMA映射的内裤
  • 看完秒懂:Linux DMA mapping机制分析

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

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

相关文章

Javaweb之SpringBootWeb案例之配置优先级的详细解析

1. 配置优先级 在我们前面的课程当中,我们已经讲解了SpringBoot项目当中支持的三类配置文件: application.properties application.yml application.yaml 在SpringBoot项目当中,我们要想配置一个属性,可以通过这三种方式当中…

Android LinearLayout 如何让子元素靠下居中对齐 center bottom

Android LinearLayout 如何让子元素靠下居中对齐 center bottom 首先你需要知道两个知识点: android:layout_gravity 指定的是当前元素在父元素中的位置android:gravity 指定的是当前元素子元素的排布位置 比如: 有这么一个布局,我需要让…

IDEA创建java项目

1. 创建单个项目 1.1 点击New Project 刚安装好会进入下面的创建页面,选择直接New Project创建新项目。 如果后续打开IDEA,并且上次的项目存在,则会打默认开上次的项目,此时可以选择File -> New->Project创建新项目。 …

《TCP/IP详解 卷一》第4章 地址解析协议ARP

目录 4.1 引言 4.2 一个例子 4.3 ARP缓存 4.4 ARP帧格式 4.5 ARP例子 4.6 ARP缓存超时 4.7 代理ARP 4.8 免费ARP和地址冲突检测 4.9 ARP命令 4.10 使用ARP设置嵌入式设备IPv4地址 4.11 与ARP相关攻击 4.12 总结 4.1 引言 地址解析: IPv4:AR…

fpga_RGB模型与硬件加速思维

一 RGB模型 人眼之所以可以看到各种颜色的光,主要是红绿蓝三种感光细胞综合感觉的结果,而红绿蓝三色被称为三原色。 饱和度均为100%的RGB能组合成8种颜色,计算机处理的BMP图片为24bit的位图,即每一通道的颜色可以组合为2的8次方&a…

什么是智慧公厕?智慧公厕改善城市环境,提升居民生活质量

智慧公厕是指通过信息化、数字化和智慧化技术手段,对公共厕所进行高效管理和服务。它利用先进的科技手段,提升城市环境、改善居民生活质量,成为现代城市建设的重要组成部分。下面将以智慧公厕源头厂家广州中期科技有限公司,大量精…

Gitflow:一种依据 Git 构建的分支管理工作流程模式

文章目录 前言Gitflow 背景Gitflow 中的分支模型Gitflow 的版本号管理简单模拟 Gitflow 工作流 前言 Gitflow 工作流是一种版本控制流程,主要适用于较大规模的团队。这个流程在团队中进行合作时可以避免冲突,并能快速地完成项目,因此在很多软…

Unity(第三部)新手绘制地形

1、创建地形 游戏对象3d对象地形 2、功能 1、 红框内按键为创建相邻地形、点击后相近地形会呈现高亮框、点击高亮区域可以快速创建地形 每块地形面积是1km*1km 2、第二个按钮是修改地形 下面的选择是修改类型 选项含义描述Raise or Lower Terrain升高或降低地形单击左键可…

分布式ID开源框架简单介绍

UidGenerator(百度) 一款基于 Snowflake(雪花算法)的唯一 ID 生成器。 UidGenerator 对 Snowflake(雪花算法)进行了改进,生成的唯一 ID 组成如下: sign(1bit):符号位(标识正负),始终为 0,代表生成的 ID…

STM32 TCP实现OTA

芯片:stm32f407 开发平台:stm32cubeide 上位机开发平台:visual studio 2017 1. FLASH分配 将flash划分为四个部分: bootloader: 0x8000000-0x800ffff app1: 0x8010000-0x805ffff app2: …

Qt Android sdk配置报错解决

使用的jdk8总是失败,报错command tools run以及platform sdk等问题。后来主要是设置jdk版本为17,就配置生效了。Android sdk路径可以选用Android Studio自带的,但是也要在Qt中点击“设置SDK”按钮做必要的下载更新等。 编译器这里会自动检测到…

Java设计模式 | 简介

设计模式的重要性: 软件工程中,设计模式(design pattern)是对软件设计中普遍存在(反复出现)的各种问题,所提出的解决方案。 这个术语由埃里希 伽玛(Erich Gamma)等人在1…

每日一题——LeetCode1512.好数对的数目

方法一 暴力循环 var numIdenticalPairs function(nums) {let ans 0;for (let i 0; i < nums.length; i) {for (let j i 1; j < nums.length; j) {if (nums[i] nums[j]) {ans;}}}return ans; }; 消耗时间和内存情况&#xff1a; 方法二&#xff1a;组合计数 var …

【GPTs分享】GPTs分享之consensus

大家好&#xff0c;元宵节快乐&#xff0c;今天给大家分享的GPTs是consensus。consensu号称无需关键字即可搜索2亿文章&#xff0c;而且给出的链接绝对保真&#xff0c;不再是胡编乱造的&#xff0c;而且能够根据指定主题辅助编写论文或者博客。 简介 consensus使用chat.cons…

GPT Pilot - 编写 95% 代码的开发工具!

在这篇博客介绍了GPT-pilot的研发细节&#xff0c;原作者将探讨GPT Pilot的技术内核 —— 一款基于GPT-4编写的开发工具&#xff0c;可以生成生产使用代码的应用。 你有没有想过&#xff0c;95%的应用代码&#xff0c;可以由AI编写&#xff0c;就像《钢铁侠》里的贾维斯一样&a…

C# 中 SQLite 查询数据库表中字段(列)是否存在的方法

查询SQLite数据库表中字段&#xff08;列&#xff09;存在的方法 使用SQL语句为&#xff1a;PRAGMA table_info([DeviceTrees]); 其中“DeviceTrees”为数据库表的名称。 使用SQLite Expert Professional工具&#xff0c;查看该语句是否起作用&#xff0c;这里使用的版本是…

基于Java SSM框架实现问卷调查系统项目【项目源码】计算机毕业设计

基于java的SSM框架实现问卷调查系统演示 B/S结构 BROWSER/SERVER程序架构方式是使用电脑中安装的各种浏览器来进行访问和使用的&#xff0c;相比C/S的程序结构不需要进行程序的安装就可以直接使用。BROWSER/SERVER架构的运行方式是在远程的服务器上进行安装一个&#xff0c;然…

绿盾限制终端网络访问权限会恢复后,别的网站访问正常就是无法访问钉钉网站和下载东西

环境&#xff1a; Win10 专业版 钉钉7.5.5 绿盾7.0 问题描述&#xff1a; 绿盾限制终端网络访问权限会恢复后&#xff0c;别的网站访问正常就是无法访问钉钉网站和下载东西 解决方案&#xff1a; 排查方法 1.重置浏览器或者更换浏览器测试&#xff08;未解决&#xff09…

linux卸载mysql8重装5

目录 背景操作卸载重装配置启动 背景 在linux&#xff08;阿里云ECS&#xff09;安装部署Hive时初始化Hive元数据库&#xff0c;遇到报错前一天两三小时没解决&#xff0c;问题定位为mysql&#xff0c;次日打算重装 操作 卸载 停止 MySQL 服务 systemctl stop mysql yum卸载…

Map集合特点、遍历方式、TreeMap排序及Collections和Arrays

目录 ​编辑 一、集合框架 二、 Map集合 特点 遍历方式 HashMap与Hashtable的区别 TreeMap Collections Arrays 一、集合框架 二、 Map集合 Map集合是一种键值对的集合&#xff0c;其中每个键对应一个值。在Java中&#xff0c;Map接口定义了一种将键映射到值的数据结…