直接回答:DMA(Direct Memory Access,直接内存访问)让外设不经过 CPU 直接读写内存:CPU 只需告诉 DMA 控制器源地址、目标地址和长度,数据搬运由控制器完成,结束后发一个中断通知 CPU,传输期间 CPU 可以执行其他任务。
展开解析:对比三种 I/O 方式:轮询完全占住 CPU;中断驱动每传一小块就打断 CPU 一次;DMA 把整块数据的搬运卸载到专用硬件,CPU 只参与"发起"和"收尾",吞吐越高收益越大。网卡收发包、磁盘读写都重度依赖 DMA,现代设备还支持 scatter-gather DMA,一次传输读写内存中多个不连续的缓冲区。
实践要点:DMA 是零拷贝技术的基础——sendfile 正是利用网卡的 gather 能力把页缓存直接送到网卡,全程不让 CPU 碰数据。DMA 也带来 cache 一致性问题:设备改了内存而 CPU 缓存还是旧值,靠硬件一致性协议(如 x86 的 MESI 监听)或驱动显式 flush/invalidate 解决。虚拟化场景还要靠 IOMMU 限制 DMA 能访问的地址范围,防止设备或虚机越界读写。
追问方向:DMA 和零拷贝是什么关系?IOMMU 解决什么问题?用户态驱动(如 DPDK)为什么能绕过内核直接收发数据?