この記事では、ダイレクトメモリアクセスの意味とその仕組みについて説明しています。
RDMA技術により、ネットワーク内のPCは、いずれかのコンピューターのプロセッサ、キャッシュ、オペレーティングシステムを使用せずに、メインメモリ内のデータを交換できます。DMA機能は、接続されたデバイスからPCのマザーボード上のメモリに、CPUを介さずに直接データを送信することをサポートします。このMiniToolの記事はDMAについてです。
ダイレクトメモリアクセスとは
ダイレクトメモリアクセス(Direct Memory Access)は、システムの機能の一つで、DMAと略されます。これは、入出力(I/O)デバイスが、中央処理装置(CPU)から独立し、メインシステムのメモリ(ランダム アクセス メモリ)にアクセスすることを可能にし、メモリ操作を高速化するものです。
合わせて読みたい記事:「八つの対処法: CPU使用率が100%!」。
一般的、CPUがプログラムされたI/Oを使用すると、読み取り・書き込み操作で完全に占有されるため、他のタスクを実行できません。DMAを使用する場合、CPUは最初に転送を開始し、転送の進行中に他の操作を実行し、操作が完了すると、DMAコントローラー(DMAC)からの割り込みを受け取ります。
ダイレクトメモリーアクセスは、より高いデータ転送速度が必要な場合や、比較的遅いI/Oデータ転送を待っている間にCPUが他のタスクを実行する必要がある場合に使用されます。
ディスクドライブコントローラー、グラフィックカード、ネットワークカード、サウンドカードなどのハードウェアシステムがDMAを採用しています。DMAは、マルチコアプロセッサでのオンチップデータ転送にも使用されます。DMAがないPCに比べ、DMAチャネルのあるPCは、はるかに少ないCPU消費量でデバイス間のデータ転送を行うことができます。
DMAは、メモリからメモリにコピーを作成し、すべてのメモリ内のデータを丸ごとコピー・移動する際に用います。複雑なメモリ操作(大きなコピーやスキャッターギャザー操作など)をCPUからDMAに転送できます。DMAは、ネットワークオンチップおよびメモリコンピューティングアーキテクチャで重要です。
ダイレクトメモリアクセスの仕組み
ダイレクトメモリアクセスはどのように機能しますか?標準のDMA(サードパーティDMAとも呼ばれます)は、DMAコントローラーを採用しています。 DMAコントローラーは、メモリアドレスを生成し、メモリの読み取りまたは書き込みサイクルを開始する役割を担っています。CPUが読み書きできる複数のハードウェアレジスタをカバーしています。
これらのレジスタは、メモリアドレスレジスタ、バイトカウントレジスタ、1つ以上の制御レジスタで構成されます。これらの制御レジスタは、送信元、宛先、転送方向(I/Oデバイスからの読み取りまたはI/Oデバイスへの書き込み)、転送ユニットのサイズ、および1バーストで転送するバイト数の組み合わせを指定できます。
入出力(I/O)、または「メモリからメモリ」操作を実行するために、まず、ホストプロセッサは、転送するワード数と使用するメモリアドレスを使用してDMAコントローラーを初期化します。次に、CPUは周辺機器にデータ転送を開始するように命令します。
次に、DMAコントローラーは、システムメモリにアドレスと読み取り/書き込み制御ラインを提供します。周辺機器とメモリの間で1バイトのデータを転送しようとすると、DMAコントローラーは完全なデータブロックが転送されるまで内部アドレスレジスタをインクリメントします。
動作モード
DMAは、モードによって動作が異なります。
バーストモード
バーストモードでは、データブロック全体が連続シーケンスで転送されます。CPUがDMAコントローラーにシステムバスへのアクセスを許可すると、DMAコントローラーはデータブロック内のすべてのバイトのデータを転送してから、システムバスの制御をCPUに戻しますが、CPUは比較的長期間非アクティブになります。このモードは「ブロック転送モード」とも呼ばれます。
サイクルスチールモード
サイクルスチールモードは、バースト転送モードに必要な時間、CPUを無効にしないシステムで使用されます。サイクルスチールモードでは、DMAコントローラーはバーストモードと同じBR(バス要求)とBG(バス許可)信号を使用してシステムバスへのアクセスを取得します。これらの2つの信号は、CPUとDMAコントローラー間のインターフェイスを制御します。
データの転送速度はそれほど速くないが、バーストモードである以上、CPUがアイドル状態になることはありません。
透過モード
透過モードは、データブロックの転送に最も時間がかかりますが、システム全体のパフォーマンスの観点からも最も効率的なモードです。透過モードでは、DMAコントローラーは、CPUがシステムバスを使用しない操作を実行する場合にのみデータを転送します。
透過モードの主なメリットは、CPUがプログラムの実行を停止することなく、ほとんどの時間、DMAが自由に転送できることです。一方、デメリットは、CPUがシステムバスを使用していないタイミングをハードウェアが判断する必要があることです。これは複雑になる可能性があります。これは「隠しDMAデータ転送モード」とも呼ばれます。