Direct Memory Access

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の開発が期待されます。

もう一度検索

【記事の利用について】

タイトルと記事文章は、記事のあるページにリンクを張っていただければ、無料で利用できます。
※画像は、利用できませんのでご注意ください。

【リンクついて】

リンクフリーです。