Direct Memory Access (DMA) 深掘り解説
Direct Memory Access(DMA)とは、
CPUを経由せずに、メモリとメモリ、またはメモリと周辺機器間で直接
データ転送を行う機能です。
CPUが
データ転送を担う従来の方法と異なり、DMAを使用することで、
CPUは
データ転送処理から解放され、他のタスクに専念できるようになります。これにより、
コンピュータ全体の処理性能が向上します。
DMAコントローラと動作
DMAを制御する専用のハードウェアをDMAコントローラ(DMAC)と呼びます。
CPUはDMACに転送元・転送先アドレス、転送サイズ、転送モードなどの情報を指示し、転送開始のトリガーを送信します。その後、
CPUは他の処理を実行し、DMACは
データ転送を完了すると、割り込み信号を
CPUに送信して終了を通知します。エラー発生時にも同様の割り込み処理が行われます。
バスアービトレーション
DMAは
CPUとバスを共有するため、バスの使用権を巡る調整が必要になります。これをバスアービトレーションと呼びます。代表的な方式として、ラウンドロビン(順番にバス権を譲渡)、サイクルスチール(
CPU未使用時にバスを使用)、バースト(一定時間、DMAがバスを独占)があります。
転送モードと注意点
DMA転送には、サイクルスチールモード(1~2ワードずつ転送)とバーストモード(大量データを一気に転送)があります。バーストモードは高速ですが、オーバーラン(受信バッファのデータが上書きされる)のリスクがあります。ラウンドロビン方式はオーバーランしにくいですが、転送速度は遅くなります。
キャッシュメモリを使用するシステムでは、
CPUとDMAによるデータ更新の競合により、キャッシュとメインメモリ間でデータの一貫性が失われる可能性があります。この問題に対処するため、適切なキャッシュ管理手法が必要です。また、仮想メモリ環境下では、DMA転送が物理メモリページ境界を跨がないよう注意が必要です。ページ境界を跨いでの転送には、DMACによるベクトルI/Oサポートが必要となります。
さらに、DMACと周辺機器からの同時割り込みによる
CPU負荷増大にも注意が必要です。割り込み負荷軽減のため、DMACまたは周辺機器のいずれかの割り込みを抑制する必要があります。
DMAの歴史と進化
DMAはPDPシリーズで初期に採用されました。
1970年代の低速
CPUでは、大容量
データ転送にDMAは不可欠でした。Z80(Z80DMA)、MC68000(MC68450)など、多くの
マイクロプロセッサは専用のDMACを搭載していました。しかし、
Intel 80286などでは、DMAはあまり使用されませんでした。
1990年代、高速
CPUの登場でI/O処理が
ボトルネックとなり、高速DMACがチップセットに搭載されるようになり、DMAが再び脚光を浴びました。Pentium以降主流となったPCIバスでは、バスマスタリングDMAが実装されています。
高機能DMAC
初期のDMACは単純な転送機能しか備えていませんでしたが、
オペレーティングシステムの普及とハードディスク利用の増加に伴い、スキャッタリング/ギャザリング機能が求められるようになりました。スキャッタリングはデータブロックを分割して転送し、ギャザリングは転送されたデータを統合する機能です。これらの機能により、
CPU負荷とI/O待ち時間の削減を実現できます。
代表的なDMAC、DMA機能を持つLSI/IP
Z80DMA
μPD8237AC-5
MC68450
i430など(Pentium以降のチップセット)
μPD71037
μPD71071
* CoreLink DMA-330
まとめ
DMAは、
CPUの負担を軽減し、高速な
データ転送を実現する重要な技術です。しかし、バスアービトレーション、オーバーラン、データの一貫性、仮想メモリ、割り込み増加など、使用上には注意が必要です。適切な設計と実装により、DMAはシステム性能の向上に大きく貢献します。今後も、より高機能で効率的なDMACの開発が期待されます。