DMA数据传输可由 2 种方法触发:或者软件请求数据(通过一个函数例如 read)或者硬件异步推数据到系统.
在第一种情况, 包含的步骤总结如下:
-
1. 当一个进程调用 read, 驱动方法分配一个 DMA 缓冲并引导硬件来传输它的数据到那个缓冲. 这个进程被置为睡眠.
-
2. 硬件写数据到这个 DMA 缓冲并且在它完成时引发一个中断.
-
3. 中断处理获得输入数据, 确认中断, 并且唤醒进程, 它现在可以读数据了.
第 二 种情况,当 DMA 被异步使用. 例如, 这发生在数据获取设备, 它在没有人读它们的时候也持续推入数据. 在这个情况下, 驱动应当维护一个缓冲以至于后续的读调用能返回所有的累积的数据给用户空间. 这类传输包含的步骤有点不同:
-
1. 硬件引发一个中断来宣告新数据已经到达.
-
2. 中断处理分配一个缓冲并且告知硬件在哪里传输数据.
-
3. 外设写数据到缓冲并且引发另一个中断当完成时.
-
处理者分派新数据, 唤醒任何相关的进程, 并且负责杂务.
第二种传输方式常常在网卡驱动中见到,不管哪种方式,DMA都依赖于中断的通知。