有关于DMA
· 阅读需 16 分钟
DMA 是一种硬件机制,其无需 CPU 干预即可实现外部设备与内存之间的数据传输,从而提高系统性能。在本文中,我详细总结了各种 DMA 控制器,并给出了 DMA 在 PC 和软盘设备之间交换数据的典型例程。
DMA 简介
什么是 DMA?
DMA(Direct Memory Access,直接内存访问)是一种硬件机制,允许外部设备(如磁盘控制器、网络接口卡或显卡等)直接与内存进行数据传输,传输过程中无需 CPU 的干预。这种机制可以大大减少 CPU 在数据传输中的负载,提高系统的整体性能。在 PC 中,最典型的就是从磁盘读取数据到内存,或从网卡读取数据到内存;嵌入式设备中,DMA 常用于传感器数据读取或信号处理。
一般情况下,DMA 的硬件实现主要由以下几个核心部分组成:
- DMA 控制器(DMAC,Direct Memory Access Controller):
- DMA 控制器是实现 DMA 的关键硬件,它负责管理设备到内存或内存到设备的数据传输。
- 它具有以下功能:
- 设置传输源地址和目标地址。
- 设置传输数据的大小。
- 管理数据传输的模式(如读模式或写模式)。
- 监控传输状态,并在完成时通知 CPU。
- 内存接口: DMA 控制器与内存直接相连,通过内存总线读取或写入数据。
- 外设接口: DMA 控制器通过 I/O 数据总线(如 PCIe 或高速串行总线等其他接口)与外设通信。
在 DMA 和 CPU 同时需要访问内存时,需要通过仲裁电路来决定访问优先级,通常 DMA 的优先级较高,可以优先访问数据总线。
为什么 DMA 可以绕过 CPU 直接传输数据?
DMA 能够绕过 CPU 传输数据的核心原因在于它直接控制了 系统总线。外设与内存的通信需要经过总线,而 DMA 控制器可以像 CPU 一样成为总线的主设备(Bus Master),从而直接与内存进行交互。
系统总线(如数据总线、地址总线和控制总线)通常由 CPU 管理,当 DMA 启动时,它会向总线控制器请求控制权。如果总线控制器同意(通常优先级较高),CPU 会暂时失去对总线的访问权。DMA 控制器在获得总线控制权后,可以直接与内存通信,而不需要 CPU 的参与。DMA 传输期间,CPU 只负责启动 DMA 操作并在完成后处理 DMA 发出的中断请求。
这种模式称为 “循环窃取(Cycle Stealing)”,DMA 控制器在需要访问内存时“窃取”总线周期,而 CPU 在剩余时间继续执行其任务。