DMA(Direct Memory Access):直接内存访问

在这里插入图片描述

DMA(Direct Memory Access):直接内存访问

一、传统CPU存取数据

CPU不直接存取外设的原因主要有两点:

  1. 速度差异:CPU的处理速度远高于外设,无法直接同步。
  2. 格式多样性:外设数据格式种类繁多,需要转换才能被CPU处理。

传统CPU获取数据的步骤如下:

  1. 加载外设数据到内存:外设数据首先被加载到内存中,因为内存的速度最接近CPU。
  2. 检查Cache:CPU检查Cache是否有需要的数据。
    • 如果命中,直接返回数据。
    • 如果未命中,从内存获取数据(这里暂时不考虑MMU)。
  3. 返回数据:将数据返回给CPU。
数据加载
检查Cache
外设
内存
Cache命中?
返回数据
从内存获取数据

二、认识DMA

1、什么是DMA

DMA(Direct Memory Access)即直接存储器访问,通过内部控制器实现内存和外设之间的数据传输。DMA的引入使得CPU可以专注于内存数据的处理,而数据的搬运工作由DMA硬件完成。

  • 开始传输时刻:DMA向CPU申请总线周期的占用时间。
  • 结束传输时刻:DMA向CPU发送中断请求,请求CPU处理数据。
CPU DMA Memory Device 开始传输时刻 DMA请求 申请总线周期 批准总线占用 读取/写入数据 结束传输时刻 发送中断请求 处理数据 CPU DMA Memory Device

2、DMA的工作模式、数据传输方式、寻址模式

工作模式

  • 直接模式:DMA直接从源地址到目的地址传输数据。
  • FIFO模式:数据累计存储在FIFO缓冲器中,达到阈值后一次性发送。

数据传输方式

  • 单字传送:每次传输一个字或字节,传输后归还总线控制权。
  • 块传送:连续占用多个总线周期进行批量传送。

寻址模式

  • 增量寻址:发送完数据后,继续发送下一个地址的数据。
  • 非增量寻址:需要软件配置下一个数据的地址。

3、为什么要使用DMA

  • 减轻CPU负担:将固定任务交给DMA,提高系统效率。
  • 提高吞吐率:DMA具备高效操作能力,提升IO效率。

三、DMA数据传输

1、准备阶段

  • DMA控制器初始化

    • 配置DMA内存缓冲区的首地址。
    • 配置DMA传输方向。
    • 配置DMA交换量。
  • 接口初始化

    • I/O设备的寻址信息。

2、传输请求

Device DMA CPU DMA请求 申请总线占用 批准使用总线 批准设备请求 Device DMA CPU

3、数据传送

  • DMA控制器向总线发送读/写命令,向I/O接口发响应信号,数据交互由内存和设备接口完成。

4、善后处理

  • DMA控制器在传输结束时向CPU发送中断,CPU重新接管总线控制权。

四、DMA保证与内存中数据一致性方法

一、使用缓存一致性协议

  • 硬件机制:如MESI协议,确保CPU缓存和内存数据一致性。
  • 缓存刷新和无效操作:软件可以触发缓存操作以确保数据一致性。

二、使用同步机制

  • 中断和轮询:DMA传输完成后通过中断或轮询进行数据一致性检查。
  • 信号量和互斥锁:在多处理器或多线程环境中使用同步机制。

三、数据校验和错误检测

  • 校验和计算:在传输前后计算校验和,确保数据完整性。
  • 错误检测和纠正码(ECC):支持ECC的系统可以检测并纠正数据错误。

四、合理的内存管理和访问控制

  • 内存保护:通过设置内存访问权限,限制DMA访问。
  • 内存分配和释放:合理管理内存,避免数据不一致和内存泄漏。

通过以上方法,DMA可以有效地保证数据在内存中的一致性,提高系统的整体性能和可靠性。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

C语言-排序

常见的排序算法分为以下四种,插入排序,选择排序,交换排序,归并排序。 一、插入排序 (一)直接插入排序 直接插入排序,将一段数组看做被分成已排序序列和未排序序列,排序过程是从未排序序列的元素开始&…

Chrome webdriver下载-避坑

WebDriver以原生的方式驱动浏览器,不需要调整环境变量。 一、window版 1.chrome和chromedriver下载地址: Chrome for Testing availability 我下载的是如下两个安装包,解压即可。 2.导包 pip install selenium然后用python代码引用即可…

【卷积神经网络】LeNet实践

模型建立 数据初始化根据模型搭建前向传播打印模型结构 前向传播数据初始化 def __init__(self):super(LeNet, self).__init__()# 第一层卷积层:# 输入:灰度图像 (1通道,大小 28x28)# 输出:6个特征图 (大小 28x28, 通过padding2保…

51c~Pytorch~合集2

我自己的原文哦~ https://blog.51cto.com/whaosoft/11878447 一、PyTorch与torch-xla的桥接 文章从XLATensor开始的溯源、注册PyTorch库实现、从PyTorch调用到torch_xla三个方面来介绍PyTorch与torch-xla的桥接 XLA (Accelerated Linear Algebra)是一个开源的机器学习编…

五大短视频平台变现方式

重新整理了五个短视频平台的平台特性,用户分析、年龄段、用户量级和各个平台的变现方式。想在这几个平台赚💰的可以多看看,有没有适合自己的变现方式⚡ 五个短视频平台: 抖音、快手、哔哩哔哩、视频号、小红书

开源Java快速自测工具,可以调用系统内任意一个方法

java快速测试框架,可以调到系统内任意一个方法,告别写单测和controller的困扰。 开源地址:https://gitee.com/missyouch/Easy-JTest 我们在开发时很多时候想要测试下自己的代码,特别是service层或者是更底层的代码,就…

数据结构开始——时间复杂度和空间复杂度知识点笔记总结

好了,经过了漫长的时间学习c语言语法知识,现在我们到了数据结构的学习。 首先,我们得思考一下 什么是数据结构? 数据结构(Data Structure)是计算机存储、组织数据的方式,指相互之间存在一种或多种特定关系的数据元素…

Linux USB开发整理和随笔

目录 1 概述 2 硬件原理基础 2.1 USB发展 2.2 USB的拓扑 2.3 硬件接口 2.4 USB总线协议 2.4.1 通信过程 2.4.2 概念关系 2.4.3 管道PIPE 2.4.4 传输 2.4.5 事务 2.4.6 包结构与类型 2.4.6.1 令牌包 2.4.6.2 数据包 2.4.6.3 握手包 2.5 描述符 2.5.1 设备描述符…

一键找出图像中物体的角点

✨✨ 欢迎大家来访Srlua的博文(づ ̄3 ̄)づ╭❤~✨✨ 🌟🌟 欢迎各位亲爱的读者,感谢你们抽出宝贵的时间来阅读我的文章。 我是Srlua小谢,在这里我会分享我的知识和经验。&am…

考研数学【线性代数基础box(数二)】

本文是对数学二线性代数基础进行总结,一些及极其简单的被省略了,代数的概念稀碎,不如高数关联性高,所以本文仅供参考,做题请从中筛选! 本文为初稿,后面会根据刷题和自己的理解继续更新 第一章…

警惕!手动调整服务器时间可能引发的系统灾难

警惕!手动调整服务器时间可能引发的系统灾难 1. 鉴权机制1.1 基于时间戳的签名验证1.2 基于会话的认证机制(JWT、TOTP) 2. 雪花算法生成 ID 的影响2.1 时间戳回拨导致 ID 冲突2.2 ID 顺序被打乱 3. 日志记录与审计3.1 日志顺序错误3.2 审计日…

【Linux】Systemtap在CentsOS9上测试成功了

在Ubuntu上测试没有成功,先看看运行成功的效果吧: 看到运行的效果,可以安心些,哈哈 指导操作来源于这里:SystemTap 主要来源于这里: https://sourceware.org/systemtap/SystemTap_Beginners_Guide/using-s…

【EthIf-03】 EthernetInterface软件栈的文件组织结构

上图为《AUTOSAR_SWS_EthernetInterface【v2.2.0 】》给出的EthernetInterface软件栈的文件组织结构,本文主要关注arccore代码中已存在的文件的功能和作用,不知道的小伙伴可以查看🔗EthIf的文件结构中的src和inc目录下的文件有哪些: 1. 文件结构 1.1 EthIf_Cbk.h 头文…

【LeetCode刷题之路】622.设计循环队列

LeetCode刷题记录 🌐 我的博客主页:iiiiiankor🎯 如果你觉得我的内容对你有帮助,不妨点个赞👍、留个评论✍,或者收藏⭐,让我们一起进步!📝 专栏系列:LeetCode…

基于windows环境使用nvm安装多版本nodejs

目录 前言 一、卸载node 二、nvm是什么? 三、nvm安装 1.官网下载 nvm 包 2. 安装nvm-setup.exe 3. 配置路径和下载镜像 4. 检查安装是否完成 四、 使用nvm安装node 五、修改npm默认镜像源为淘宝镜像 六、环境变量配置 1. 新建目录 2. 设置环境变量 七…

Neo4j+Neovis+Vue3:前端连接数据库渲染

Neovis(github):https://github.com/neo4j-contrib/neovis.js Neovis配置文档:neovis.js (neo4j-contrib.github.io) 一、安装Neo4j 参考文章:neo4j下载安装配置步骤-CSDN博客 二、Neovis使用 1.npm引入 ?npm ins…

《宇宙机器人》提示错误弹窗“找不到d3dx9_43.dll”是什么原因?“d3dx9_43.dll缺失”怎么解决?

电脑游戏运行时常见问题解析:《宇宙机器人》提示“找不到d3dx9_43.dll”的解决之道 TGA2024落幕,年度最佳游戏——《宇宙机器人》,作为一名在软件开发领域深耕多年的从业者,我深知电脑游戏在运行过程中可能会遇到的各种挑战&…

Cesium 限制相机倾斜角(pitch)滑动范围

1.效果 2.思路 在项目开发的时候,有一个需求是限制相机倾斜角,也就是鼠标中键调整视图俯角时,不能过大,一般 pitch 角度范围在 0 至 -90之间,-90刚好为正俯视。 在网上查阅了很多资料,发现并没有一个合适的…

28. Three.js案例-创建圆角矩形并进行拉伸

28. Three.js案例-创建圆角矩形并进行拉伸 实现效果 知识点 WebGLRenderer (WebGL渲染器) WebGLRenderer 是 Three.js 中用于渲染 3D 场景的主要渲染器。 构造器 WebGLRenderer( parameters : Object ) 参数类型描述parametersObject渲染器的配置参数,可选。 …

transformer学习笔记-自注意力机制(2)

经过上一篇transformer学习笔记-自注意力机制(1)原理学习,这一篇对其中的几个关键知识点代码演示: 1、整体qkv注意力计算 先来个最简单未经变换的QKV处理: import torch Q torch.tensor([[3.0, 3.0,0.0],[0.5, 4…