DMA(ダイレクトメモリアクセス)とは?
DMAとは「Direct Memory Access(ダイレクトメモリアクセス)」の略で、コンピューターにおいて入出力デバイスが中央処理装置(CPU)を介さずに、主記憶装置と直接データの送受信を行う方法です。DMA転送でデータ処理を行うことで、CPUの負荷を軽減し、システムの性能を向上させることができます。
DMAは、DMAC(DMAコントローラ)と呼ばれるICチップによって管理されます。DMACはマザーボードなどに搭載されているチップです。CPUの代わりにデータ伝送の制御を担当し、複数の伝送を同時に管理できる機能があります。
また、DMA転送を行なう際に各装置がDMAコントローラに対して使用する通信経路がDMAチャネルです。コントローラは複数のチャネルを持っており、各装置はこれらのチャネルのうち一つを使用してデータ伝送を行います。伝送が完了するとチャネルは解放され、他の装置が使用可能になる仕組みです。
DMA転送の仕組み
コンピューターのハードウェア・ソフトウェア間の通信で使用されるシステムリソースには、以下4つのタイプがあります。
- I/Oアドレス
- メモリアドレス
- 割り込み要求番号(IRQ)
- DMA(ダイレクトメモリアクセス)チャネル
このうち、DMAチャネルは、周辺デバイスとシステムメモリ間のデータ通信に使用されます。4つのシステムリソースすべてがバス上の特定のラインに設定されており、それぞれIRQ用、I/Oアドレス・メモリアドレス用、DMAチャネル用に分かれています。
DMAコントローラは、メモリアドレスレジスタ、バイトカウントレジスタ、および制御レジスタで構成されます。これらのレジスタは、転送するデータの量・送信元や送信先・転送方向・転送単位のサイズなど、通信の詳細な情報を管理するものです。
DMA転送が開始されると、DMAコントローラがシステムメモリにアドレスや読み取り・書き込みの制御ラインを作り、周辺機器とメモリの間でデータ転送を開始します。データがすべて転送されたら、DMAコントローラがCPUに転送終了を伝えて、DMAによるデータ転送は完了です。
DMAのメリット
DMAを利用することで、以下のようなメリットがあります。
CPUの負荷軽減
DMAを使用すると、データ転送のための処理を専用のハードウェアが担当するため、CPUの負荷が軽減されます。そのため、CPUは他の計算処理やタスクの実行により多くのリソースを割り当てることが可能です。
高速なデータ転送
DMAコントローラは、データ転送を最適化できるよう設計されています。そのため、CPUを使用する場合に比べて高速なデータ転送が可能です。とくに、大量のファイルを連続して転送する際には、その性能差が顕著になります。
割り込み処理の削減
通常のデータ転送では、データの一部ごとにCPUへ割り込みが発生するため、処理の中断が頻繁に起こります。しかし、DMA転送を利用すると、割り込みの回数を大幅に減らすことが可能です。そのため、システム全体の効率向上が期待できます。
送受信の自動化
シリアル通信などでは、DMA転送を使用することで、データの送受信を自動化できます。データの読み込み・書き込みのための待ち時間なしに、連続したデータ通信ができるため、通信の効率が向上します。
システムリソースの効率的な使用
DMA転送を利用すると、システムリソースをより効率的に使用できます。大量データの送受信が必要な場合でも、DMAによってデータ転送が効率的に行われることで、CPUはデータ転送が行われている間に他のタスクを処理可能です。このように、システムのパフォーマンスを維持しながら、他の処理にリソースを分配できます。
DMAのデメリット
DMAの利用には、以下のようなデメリットもあります。
システムバスの占有
DMA転送の最大のデメリットは、転送中にDMAコントローラ(DMAC)がシステムバスを占有してしまう点です。この間、CPUや他のデバイスはバスにアクセスできなくなり、CPUのプログラム実行が一時停止してしまう可能性があります。これにより、システムの応答性が低下する場合があります。
ハードウェアの複雑さ
DMA転送を実装するには、適切なDMAコントローラ(DMAC)が必要です。また、CPUがシステムバスを使用していないタイミングを正確に判断する仕組みが必要となることもあります。これらの制約からハードウェア設計が複雑になり、DMAを利用することでコストが増加する可能性があります。
リソースの競合
DMA転送が頻繁に行われるシステムでは、システムバスやメモリアクセスの競合が生じやすい点もデメリットです。とくに、複数のDMAチャネルが同時にアクティブになると、互いの転送が競合し、システム全体のパフォーマンスに影響を及ぼす場合もあります。
キャッシュの整合性の問題
DMAを利用すると、キャッシュの整合性の問題を引き起こす可能性があります。DMA転送によってメモリが更新されると、CPUキャッシュに保持されているデータが正しく更新されない可能性があるためです。この問題の解決策としては、外部からのDMA転送を開始する前にキャッシュを書き込む方法や、外部書き込みがキャッシュコントローラに通知された際に受信DMA転送においてキャッシュを無効にする方法などが挙げられます。
DMAの動作モード
DMAには、いくつかの動作モードがあります。ここでは主な動作モードについて、以下3つについて解説します。
- バーストモード(ブロック転送モード)
- サイクルスチールモード(シングル転送モード)
- デマンド転送モード
バーストモード(ブロック転送モード)
バーストモード(ブロック転送モード)では、データブロック全体が一連の連続シーケンスで転送されます。システムバスへのアクセス権がDMAコントローラに渡されたあと、データブロック内の全バイトを転送し終えるまで、DMAはバスの制御をCPUに返しません。そのため、CPUが比較的長い時間、活動を停止するのが特徴です。高速転送が可能ですが、CPUの使用が制限されるデメリットもあります。
サイクルスチールモード(シングル転送モード)
サイクルスチールモード(シングル転送モード)は、データ転送速度はバーストモードほど速くないものの、CPUを完全にはアイドル状態にしない方法です。このモードでは、DMA転送のために必要な一連のバス制御信号を利用して、DMAコントローラがシステムバスへのアクセス権を一時的に取得します。DMA転送が1サイクル実行されるたびにバス制御権をCPUに返すため、CPUや他のデバイスも並行して動作できる点が特徴です。
デマンド転送モード
デマンド転送モードは、DMAスレーブデバイスからの転送要求信号に応じてDMA転送が開始する動作モードです。要求信号がアクティブな間のみ転送を行い、スレーブデバイスが要求を取り下げるとDMA転送を中断し、バス制御権をCPUなどの他のデバイスに返します。デマンド転送モードは、バスを効率的に利用できる点がメリットですが、ハードウェア設計が要求信号に対応していなければならないなどの制約もあります。