FreeBSD ハンドブック : FreeBSD の内部 : DMAとはどういったものでどういう働きをするのか : DMA操作モードとその設定
Previous: DMA ページレジスタ および 16メガ アドレス空間制限
Next: DMAのプログラミング

23.3.3. DMA操作モードとその設定

8237 DMA はいくつかのモードで動作します. 主なモードは, 以下のとおりです.

シングル転送モード

シングルバイト(もしくはワード)が転送されます. DMAは1バイト毎にバスを開放し, 再び要求しなくてはなくてはなりません. これは一般に, すぐにはデータのブロック全てを転送できないデバイスに よって使用されます. 周辺装置は次の転送の準備ができる毎にDMAを要求します.

標準的なPCコンパチブルなフロッピーディスクコントローラ(NEC 765)は 1バイトのバッファしか持たないので, このモードを使用します.

ブロック/デマンド転送モード

一旦DMACがシステムバスを取得すると, 最大64kまでのデータブロック 全体が転送されます. もし周辺装置が余分に時間を必要とするときは, 転送を一時中断するためにREADY信号を有効にします. READY信号は過度に使われるべきではなく, 遅い周辺装置の転送の場合は シングル転送モードを代わりに使うべきです.

ブロック転送モードとデマンド転送モードの違いは, 一旦ブロック転送が 始まると,転送カウンタか0になるまでそれが行われるところです. DRQは-DACKが有効になるまでの間は有効でなければなりません. デマンドモードはDRQが有効な間転送が続けられます. DRQが有効でなくなった場合, DMAはその時点で転送を中断し, バスを解放してCPUに返します. その後、DRQが有効になると, 転送は中断したところから再開されます.

データの転送, 特に転送に使われるメモリ番地が16Mを越える場合に, CPUを使った方が効率がよくなるまでCPUの速度が向上する以前の 古いハードディスクコントローラはデマンドモードを使っていました.

カスケード転送モード

このメカニズムはDMAチャネルがバスを要求することを許可する ものですが, 接続されたデバイスはバス上のアドレス情報の配置に ついてDMACに代わって責任を持ちます. これは「バスマスタ」と呼ばれる技術の実装に利用されます.

カスケードモードのDMAチャネルがバスのコントロールを受け取ると, DMAは通常行われるようなバス上のアドレスとI/Oコントロール信号の 出力を行いません. 代わりに, DMAはアクティブなチャネルの -DACK信号を 有効にします.

この時点で, アドレスとバスコントロール信号の供給は DMAチャネルに接続された周辺機器が担当します. 周辺機器はシステムバスの完全なコントロールを行い, 16メガ以下の任意のアドレスの読み込みおよび書き込みを行うことが できます. 周辺機器はバスの使用を終えるとDRQ線を無効にするので, DMAコントローラはCPUもしくは他のDMAチャネルに制御を返すことが できます.

カスケードモードは複数のDMAコントローラを相互接続するのに 使われます. PC内ではDMAチャネル4がまさにこの用途に使われています. 周辺機器がDMAチャネル0, 1, 2, 3でバスを要求すると, スレーブDMAコントローラは HLDREQ を有効にしますが, この線はCPUではなく, 実際にはプライマリDMAコントローラのDRQ4に 接続されています. その後, チャンネル4になにか仕事があるものと見なしたプライマリの DMAコントローラは HLDREQ を使ってCPUにバスを 要求します. バスが与えられると, -DACK4が有効になりますが, この線は実際にはスレーブDMAコントローラの HLDA信号に 接続されています. スレーブDMAコントローラはその後要求したDMAチャネル (0, 1, 2, 3) に対してデータを転送するか, SCSIコントローラのような バスマスタリングを要求する周辺機器にバスを許可します.

このような配線がおこなわれているため, PC/ATシステムの 周辺機器ではDMAチャネルは 0, 1, 2, 3, 5, 6, 7のみが使用できます.

注: 初期のIBM PCコンピュータでは, DMAチャネル0は操作の リフレッシュのために予約されていますが, 最近のシステムでは通常, 周辺機器によって使用することができます.

周辺機器がバスマスタリングを行っている時は, システムバスを保持している間絶えずメモリにもしくはメモリから データを転送することが重要です.もし, 周辺機器がこのように できないときは, システムがメインメモリのリフレッシュを 行なえるようにしばしばバスを開放しなくてはなりません.

全てのPCでメインメモリとして使われるダイナミックRAMは, 中身が「満たされている」ビットを保持するため 頻繁にアクセスされなくてはなりません. ダイナミックRAMは, それぞれが1ビットのデータを記憶するコンデンサが たくさん集まって構成されています. これらのコンデンサは充電された 状態で"1", 充電されていない状態で"0"を表します. 全てのコンデンサは放電するため, "1"の値を保持するために, 一定の間隔で電力を加える必要があります. 実際にRAMチップはRAMの適切な場所に電力を送る作業を行ないますが, メモリのリフレッシュ作業がRAMを普通にアクセスする時と 衝突しないように, それをいつ行なうかを コンピュータが休止状態の時に知らせなくてはなりません. もしコンピュータがメモリのリフレッシュを行なえない場合は, メモリの中身はわずか数ミリ秒で壊れてしまいます。

メモリの読み込みと書き込みのサイクルはリフレッシュサイクルとして カウントされる(ダイナミックRAMのリフレッシュサイクルは 実際には不完全なメモリ読み込みサイクルになります)ので, 周辺機器のコントローラが連続するメモリ番地からデータの読み込み または書き込みを行う間は, メモリの全てがリフレッシュされます.

バスマスタリングはいくつかのSCSIホストインターフェースやその他の ハイパフォーマンスな周辺機器コントローラに見られます.

自動初期化転送モード

このモードにおいてDMAはバイト, ブロック, デマンド転送を行いますが, DMA転送カウンタが0になると, カウンタとアドレスはDMAチャネルが もともとプログラムされた時のものに戻されます. これは, 周辺機器が転送を要求している間は転送が続けられることを 意味します. 転送領域としてDMACにプログラムされた固定バッファの中で, 出力操作でDMACがデータを読み出す前もって新しいデータを 書き込んだり入力操作でDMACが書き込んだあとに, そこから新しいデータを読み出す作業はCPUが受け持ちます.

このテクニックは, サンプリング用のバッファが小さいもしくは それを持たないオーディオデバイスによく使われます. この「環状」バッファの管理は更なるCPUオーバーヘッドになりますが, DMAカウンタが0になり, 再プログラムされるまでDMAが停止してしまう ことによって起きる遅延は, この方法でしかなくす事ができない 場合もあります.


FreeBSD ハンドブック : FreeBSD の内部 : DMAとはどういったものでどういう働きをするのか : DMA操作モードとその設定
Previous: DMA ページレジスタ および 16メガ アドレス空間制限
Next: DMAのプログラミング