DMA¶
DMA 是 direct memory access直接内存访问 的缩写。它是一种允许计算机内的硬件子系统(如磁盘驱动器、图形卡、网卡、声卡等)直接在内存中读取或写入数据,而无需中央处理器的全程参与 的技术。
可以把它想象成一个“数据搬运专员”。没有DMA时,CPU需要亲自处理所有数据的搬运,效率低下。有了DMA,CPU只需下达指令(告诉DMA从哪里搬、搬到哪里、搬多少),具体的搬运工作则由这个“专员”独立完成,CPU在此期间可以处理其他任务。
DMA 的工作流程¶
当启用DMA时,流程变得高效:
- 初始化:CPU对DMA控制器进行设置,告诉它:
- 源地址:数据从哪里来(如硬盘缓冲区地址)。
- 目标地址:数据到哪里去(内存中的某个位置)。
- 数据长度:要传输多少字节的数据。
- 启动:CPU下达“开始传输”命令,然后立即返回,继续执行其他程序。DMA控制器开始接管数据传输工作。
- 数据传输:
- DMA控制器向系统总线发出总线请求。
- CPU释放对总线的控制权(在传输小片段数据时,CPU可能只是被短暂挂起,这称为“周期窃取”)。
- DMA控制器获得总线控制权,直接在内存和外设之间搬运数据,一个字节一个字节或一块一块地传输。
- 完成通知:当所有数据传输完毕后,DMA控制器向CPU发出一个中断信号。
- 收尾:CPU响应中断,执行一小段中断服务程序,确认传输完成,并进行后续处理(如通知操作系统数据已就绪)。
DMA 的关键组件¶
- DMA控制器:一个独立的芯片或集成在南桥芯片组中的模块。现代系统中可能有多个DMA通道。
- 总线仲裁器:负责协调CPU和DMA控制器对系统总线的使用,确保不会发生冲突。
DMA 的主要优点¶
- 解放CPU:CPU从繁重的数据搬运工作中解脱出来,可以更高效地执行计算和调度任务,显著提升系统整体性能和并发能力。
- 提高数据传输速率:DMA是为大数据块传输而优化的,通常比CPU用程序控制传输要快。
- 降低功耗:CPU在等待慢速I/O操作时,可以进入低功耗的休眠状态。
DMA 在操作系统中的体现¶
操作系统内核的设备驱动程序是负责配置和使用DMA的关键软件部分:
- 分配缓冲区:驱动程序需要为DMA操作分配物理上连续的内存块(或使用特殊机制处理不连续的内存),因为DMA控制器直接操作物理地址。
- 设置DMA描述符:告诉DMA控制器传输的详细信息。
- 处理中断:在DMA传输完成或出错时,驱动程序的中断处理例程会被调用。
- 内存一致性:需要处理缓存一致性问题。如果CPU的缓存中保留了将要被DMA写入的内存区域,那么CPU可能会读到旧的缓存数据而不是DMA新写入的数据。操作系统和驱动程序需要使用(如刷新缓存)来保证数据一致性。
应用场景举例¶
- 磁盘I/O:读写硬盘、SSD时,数据通过DMA在磁盘缓存和内存页面缓存之间传输。
- 网络通信:网卡收到数据包后,直接通过DMA写入内核指定的内存缓冲区;发送时,也从内存缓冲区直接读取。
- 图形处理:GPU通过DMA从系统主内存中获取纹理、顶点数据,或将渲染好的帧数据传回。
- 音视频采集/播放:声卡、摄像头等设备持续不断地通过DMA与内存交换数据流。
总结¶
DMA技术是现代计算机体系结构中提升I/O效率的核心机制。它像一个高效的“数据搬运工”,让CPU这位“总指挥”得以从琐碎的搬运工作中脱身,专注于核心计算任务,从而实现了计算与I/O的并行,是构建高性能操作系统的基石之一。