Direct Memory Access

Direct Memory Access（DMA）とは、プログラムされた機械語の命令群の実行によってアキュムレータなどを介する方法によらず、メモリとメモリまたはメモリとI/Oデバイスの間で直接データを転送することである。

専用回路のことを DMAC（DMA Controller）と言う。

概要 
現代でのDMAの重要性は、つまるところCPUの転送速度の枷を外したところにある。DMAの技術が発生する以前は、CPUはデータの転送時間のあいだ待たなくてはならず、その間は他の作業をこなすことはできなかった。外部入出力（I/O）の転送速度はRAMよりも遅かったことがこの原因である。DMAがあれば、CPUは転送時間を有意にタスクへと割くことができる。この利点は組み込み向けプロセッサにおいても同様に効果があった。ただし、転送バスは一部使用中となる。したがって、DMAによって転送時間を有効に使えるとしても、それはプログラムがまさに今DMA転送中のデータを使用しないときに限られてしまう。

DMA転送は、CPUによって行われるものではない。CPUはDMA転送命令を実行するが、これはつまるところ、マザーボードのチップセットに内蔵されたDMAコントローラに、転送開始を指示しているだけである。この形式は過去のISAバスによってみられた方式であるが、現代のPCIバスにはより優れた設計思想が組み込まれており、「Bus mastering DMA」、すなわち、I/O機器の側がPCIバスの制御を任され、DMA転送をすべて司る。一方組込デバイスでは、CPU内でバスに直結されたDMAエンジンがチップ内のバスを操作してDMAを実現する。

DMAの利点は、継続的な読み出しを必要とする、ネットワークのパケット送信や音楽再生やビデオ配信などの機能を、データ通信のためにリソースを割くことなく行うため、その専用の組み込みチップで使われている。また同様に、CPUの多コア化にもとても有効である。１チップ上での多コア化だけでなく、大規模なコンピュータでのクラスタ化にも有用である。この際、DMA通信の状態通知ピンとして、受信状態を示すHOLDピンと、送信状態を示すHLDAピンが存在する。

仮想記憶アドレス上で DMA を利用する場合、ページ境界をまたぐことがないようにする必要がある。境界をまたいだ場合、後続の論理アドレスページに対応する物理アドレスページが同様に連続した後続領域に確保されるとは限らないからである。

歴史 
DMAはPDPシリーズにおいて採用されている。後年の数MHzで動作するマイクロプロセッサでは、CPUによるデータ転送でハードディスク等の10MB/秒程度の転送速度を発揮する事は困難であったため、専用のコントローラでデータ転送を行う必要があった。このコントローラは、データ転送を高速に行う機能に特化したCPUであったともいえる。例として、Z80にはZ80DMA、MC68000には、MC68450などのDMAコントローラ（DMAC）が存在した。そのほか、日立のH8マイコンにDMACが存在している。

Intelのi80286（APX286）などでは、当時通常のI/Oを制御するためには充分な動作速度だった事、主流のパーソナルコンピュータにおいて、i8249等の低速なDMACしか搭載されておらず、他に適当なDMACが存在しなかった事などから、DMAはあまり使用されなくなった。

CPUの世代がPentiumになり、充分に高速になると、今度は、低速なI/Oの管理がボトルネックとなったため、いわゆるチップセットにI/O専用の高速なDMACが搭載されたり、周辺機器制御LSIが簡単なDMA機能を持つようになり、再度DMAが活用されるようになった。Pentium以降主流となったPCIバスでは、バスマスタリングとしてDMAが実装されている。

高機能DMAC 
初期のDMACは単純に指定されたアドレス範囲を指定されたメモリもしくはポートに入出力する機能のみを備えていた。しかしオペレーティングシステムが普及し、ハードディスクへのI/OにDMACを使う様になってから、DMACには「データブロックを分割する（スキャッタリング）」「データブロックを集約する（ギャザリング）」を行う機能を要求された。MC63450 DMAC等には、DMACがリンクリストを読み取って転送内容を分割したり集約する機能が搭載されている。PC/AT互換機向けのSCSIホストアダプタカード等では、コントローラチップに集積されているDMACがこの機能を担当していた。スキャッタリング・ギャザリング機能が無い場合CPUは最低でも1セクタ分ずつメモリ・メモリ間転送を行わなければならず、またDMACに読み取らせるメモリ領域が転送完了するまで使用できないため、I/O時のCPU負荷上昇とI/O待ち時間が発生しシステム性能に悪影響を与えた。

DMAの方式 
バーストモードDMA(ブロック転送と呼ぶ資料もある)
CPUからメモリBUS制御を渡してもらい、データを一気に転送する方法。
サイクルスチールモードDMA
CPUからメモリBUS制御を渡してもらい、1～2ワードずつ転送する方法。CPUは隙間なくメモリBUSを利用するとは限らないので、CPUが処理を進めるのと並行したデータ転送が可能となり得る。

代表的なDMAC、DMA機能を持つLSI 
Z80DMA
μPD8237AC-5(-5互換)
MC68450
i430など、PentiumCPU以降対応のチップセット

関連項目 
 バスマスタリング
 Remote Direct Memory Access
 PIO病

外部リンク 
Microcomputer Interfacing（英文）（PDFファイル）

脚注 

CPU
記憶装置
ハードウェア
マザーボード
入出力