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

简介: DMA(Direct Memory Access)是一种允许外设直接与内存进行数据传输的技术,无需 CPU 干预。它通过减轻 CPU 负担、提高数据传输效率来提升系统性能。DMA 的工作模式包括直接模式和 FIFO 模式,数据传输方式有单字传送和块传送,寻址模式有增量寻址和非增量寻址。通过缓存一致性协议、同步机制、数据校验和合理的内存管理,DMA 确保了数据在内存中的一致性和完整性。

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

一、传统CPU存取数据

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

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

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

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

二、认识DMA

1、什么是DMA

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

  • 开始传输时刻:DMA向CPU申请总线周期的占用时间。
  • 结束传输时刻:DMA向CPU发送中断请求,请求CPU处理数据。

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

工作模式

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

数据传输方式

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

寻址模式

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

3、为什么要使用DMA

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

三、DMA数据传输

1、准备阶段

  • DMA控制器初始化
  • 配置DMA内存缓冲区的首地址。
  • 配置DMA传输方向。
  • 配置DMA交换量。
  • 接口初始化
  • I/O设备的寻址信息。

2、传输请求

3、数据传送

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

4、善后处理

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

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

一、使用缓存一致性协议

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

二、使用同步机制

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

三、数据校验和错误检测

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

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

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

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

目录
相关文章
|
19天前
|
传感器 人工智能 物联网
C 语言在计算机科学中尤其在硬件交互方面占据重要地位。本文探讨了 C 语言与硬件交互的主要方法,包括直接访问硬件寄存器、中断处理、I/O 端口操作、内存映射 I/O 和设备驱动程序开发
C 语言在计算机科学中尤其在硬件交互方面占据重要地位。本文探讨了 C 语言与硬件交互的主要方法,包括直接访问硬件寄存器、中断处理、I/O 端口操作、内存映射 I/O 和设备驱动程序开发,以及面临的挑战和未来趋势,旨在帮助读者深入了解并掌握这些关键技术。
39 6
|
1月前
|
存储 编译器 Linux
【c++】类和对象(上)(类的定义格式、访问限定符、类域、类的实例化、对象的内存大小、this指针)
本文介绍了C++中的类和对象,包括类的概念、定义格式、访问限定符、类域、对象的创建及内存大小、以及this指针。通过示例代码详细解释了类的定义、成员函数和成员变量的作用,以及如何使用访问限定符控制成员的访问权限。此外,还讨论了对象的内存分配规则和this指针的使用场景,帮助读者深入理解面向对象编程的核心概念。
81 4
|
2月前
|
缓存 算法 数据处理
如何选择合适的内存访问模式
【10月更文挑战第20天】如何选择合适的内存访问模式
51 1
|
2月前
|
存储 容器
内存越界访问(Out-of-Bounds Access)
【10月更文挑战第12天】
237 2
|
2月前
|
Rust 编译器
|
3月前
|
存储 网络协议 大数据
一文读懂RDMA: Remote Direct Memory Access(远程直接内存访问)
该文档详细介绍了RDMA(远程直接内存访问)技术的基本原理、主要特点及其编程接口。RDMA通过硬件直接在应用程序间搬移数据,绕过操作系统协议栈,显著提升网络通信效率,尤其适用于高性能计算和大数据处理等场景。文档还提供了RDMA编程接口的概述及示例代码,帮助开发者更好地理解和应用这一技术。
|
3月前
|
编译器 Linux C语言
不对齐的内存访问 【ChatGPT】
不对齐的内存访问 【ChatGPT】
58 11
|
3月前
|
存储 安全 Linux
将文件映射到内存,像数组一样访问
将文件映射到内存,像数组一样访问
37 0
|
3月前
ARM64技术 —— MMU处于关闭状态时,内存访问是怎样的?
ARM64技术 —— MMU处于关闭状态时,内存访问是怎样的?
|
4月前
|
设计模式 uml
在电脑主机(MainFrame)中只需要按下主机的开机按钮(on()),即可调用其它硬件设备和软件的启动方法,如内存(Memory)的自检(check())、CPU的运行(run())、硬盘(Hard
该博客文章通过一个电脑主机启动的示例代码,展示了外观模式(Facade Pattern)的设计模式,其中主机(MainFrame)类通过调用内部硬件组件(如内存、CPU、硬盘)和操作系统的启动方法来实现开机流程,同时讨论了外观模式的优缺点。