直接存储器访问

直接存储器访问(Direct Memory Access,DMA)是计算机科学中的一种内存访问技术。它可以让外设可以独立地直接读写系统存储器,而不需绕道中央处理器(CPU),DMA是一种快速的数据传送方式。有专门DMA控制器,同时现在很多数据量比较大的外设自带DMA功能。简单地说,DMA操作有以下3步:(1)初始化DMA操作的源地址和目的地址;(2)CPU启动DMA操作;(3)DMA操作完成后,中断CPU。

DMA传输常使用在将一个存储器区的数据复制到另外一个设备上。首先中央处理器初始化这个传输动作,传输动作是由DMA控制器来实行和完成。要初始化数据传输时,需设置DMA通道的地址和计数寄存器,以及数据传输的方向,读取或写入。然后指示DMA硬件开始这个传输动作。当传输结束的时候,DMA设备就会以中断的方式通知中央处理器。"分散-收集"(Scatter-gather)DMA允许在一次单一的DMA处理中传输数据到多个存储器区域。相当于把多个简单的DMA要求串在一起。同样,这样做的目的是要减轻中央处理器的多次输出输入中断和数据复制任务。

缓存一致性问题

DMA会导致缓存一致性问题。像中央处理器带有缓存与外部存储器的情况,DMA的运作则是去访问外部存储器,当中央处理器访问外部存储器某个地址的时候,暂时先将新的值写入缓存中,但并未将外部存储器的数据更新,若在缓存中的数据尚未更新到外部存储器前发生了DMA,则DMA过程将会读取到未更新的数据。

相同的,如果外部设备写入新的值到外部存储器内,则中央处理器若访问缓存时则会访问到尚未更新的数据。

这些问题可以用两种方法来解决:

缓存同调系统(Cache-coherent system):以硬件方法来完成,当外部设备写入存储器时以一个信号来通知缓存控制器某存储器地址的值已经过期或是应该重新更新数据。

非同调系统(Non-coherent system):以软件方法来完成,操作系统必须确认缓存读取时,DMA程序已经开始或是禁止DMA发生。

参考文献:

[1] 维基百科. 直接存储器访问.

DMA简介的更多相关文章

  1. STM32之DMA

    一.DMA简介 1.DMA简介 DMA(Direct Memory Access:直接内存存取)是一种可以大大减轻CPU工作量的数据转移方式. CPU有转移数据.计算.控制程序转移等很多功能,但其实转 ...

  2. STM32学习笔记——DMA控制器(向原子哥学习)

    一.DMA简介 DMA,全称为:Direct Memory Access,即直接存储器访问,DMA 用来提供在外设和存储器之间或者存储器和存储器之间的高速数据传输.当 CPU 初始化这个传输动作,传输 ...

  3. 基于uFUN开发板的心率计(一)DMA方式获取传感器数据

    前言 从3月8号收到板子,到今天算起来,uFUN到手也有两周的时间了,最近利用下班后的时间,做了个心率计,从单片机程序到上位机开发,到现在为止完成的差不多了,实现很简单,uFUN开发板外加一个Puls ...

  4. 关于STM32 DMA相关总结[概述知识点]

    关于DMA相关知识的总结,写给未来的自己,希望有帮助.立个Flag[坚持写博客总结自己工作或学习记录自己的生活] ------------------------------------------- ...

  5. 第21章 DMA—直接存储区访问

    本章参考资料:<STM32F76xxx参考手册>DMA控制器章节. 学习本章时,配合<STM32F76xxx参考手册>DMA控制器章节一起阅读,效果会更佳,特别是涉及到寄存器说 ...

  6. DMA—直接存储区访问

    本章参考资料:< STM32F4xx 中文参考手册> DMA 控制器章节.学习本章时,配合< STM32F4xx 中文参考手册> DMA 控制器章节一起阅读,效果会更佳,特别是 ...

  7. 第21章 DMA—直接存储区访问—零死角玩转STM32-F429系列

    第21章     DMA—直接存储区访问 全套200集视频教程和1000页PDF教程请到秉火论坛下载:www.firebbs.cn 野火视频教程优酷观看网址:http://i.youku.com/fi ...

  8. STM32之串口DMA接收不定长数据

    STM32之串口DMA接收不定长数据 引言 在使用stm32或者其他单片机的时候,会经常使用到串口通讯,那么如何有效地接收数据呢?假如这段数据是不定长的有如何高效接收呢? 同学A:数据来了就会进入串口 ...

  9. 二十二、DMA驱动

    一.DMA简介 DMA(Direct Memory Access,直接内存存取),DMA传输将数据从一个地址空间复制到另外一个地址空间.传输过程由DMA控制器独立完成,它并没有拖延CPU的工作,可以让 ...

随机推荐

  1. 【Java】DateUtil(2)

    import java.sql.Timestamp; import java.text.ParseException; import java.text.SimpleDateFormat; impor ...

  2. python中optparse模块用法

    optparse模块主要用来为脚本传递命令参数,采用预先定义好的选项来解析命令行参数. 首先需要引入optparser模块,然后执行初始化,实例化一个OptionParser对象(可以带参,也可以不带 ...

  3. [JSOI 2007] 字符加密

    [题目链接] https://www.lydsy.com/JudgeOnline/problem.php?id=1031 [算法] 将字符串倍长 , 构建后缀数组 , 然后按要求输出即可 时间复杂度 ...

  4. 出现ImportError: No module named win32api异常

    ImportError: No module named win32api出现异常 实际是需要安装和自己python兼容的win32all 在http://starship.python.net/cr ...

  5. SPOJ FIBOSUM && FIBOSUM2

    Fibonacci数列定义为 $$f_n = f_{n-1}+f_{n-2}, \text{以及初值}f_0=0, f_1=1.$$ 本文之讨论,皆在模$10^9+7$意义下. FIBOSUM 给定$ ...

  6. 2、HTML的head内标签

    一.Meta(metadata information) 提供有关页面的元信息,例:页面编码.刷新.跳转.针对搜索引擎和更新频度的描述和关键词 1.页面编码(告诉浏览器是什么编码) <meta ...

  7. 一个NodeJS写的基于MVC的服务器

    目前实现了静态文件下载.根据地址导航到控制器相应的控制器方法,但视图模版功能目前还未实现. 服务器代码(httpserver.js): var http = require("http&qu ...

  8. Tensorflow多线程输入数据处理框架(一)——队列与多线程

    参考书 <TensorFlow:实战Google深度学习框架>(第2版) 对于队列,修改队列状态的操作主要有Enqueue.EnqueueMany和Dequeue.以下程序展示了如何使用这 ...

  9. Redis生成主键ID

    使用Redis來生成主鍵ID策略,這裡主要使用 RedisAtomicLong 類來實現主鍵生成策略.具體代碼如下: /** * @Description: 获取自增长值 * @param key k ...

  10. 布线问题 最小生成树 prim + kruskal

    1 : 第一种 prime     首先确定一个点 作为已经确定的集合 , 然后以这个点为中心 , 向没有被收录的点 , 找最短距离( 到已经确定的点 ) , 找一个已知长度的最小长度的 边 加到 s ...