FreeBSD ハンドブック : FreeBSD の内部 : DMAとはどういったものでどういう働きをするのか : DMA転送の例
Previous: DMAとはどういったものでどういう働きをするのか
Next: DMA ページレジスタ および 16メガ アドレス空間制限

22.3.1. DMA転送の例

これはDMA転送の手順の例です. この例では, フロッピーディスクコントローラ (FDC)が ディスケットから1バイト読み込んで, DMAを使って,メモリの0x00123456番地に 格納したいとします. 処理は, FDCによって, DRQ2信号を有効にして DMAコントローラに要求を伝えることで開始します.

DMAコントローラはDRQ2シグナルが有効になったことを記録します. するとDMAコントローラはDMAチャネル2がプログラムされ, 有効に なっていることを確認します. DMAコントローラはまた, 他のDMAチャネルがアクティブでないか, または より高い優先度を持っていないかを確認します. 一旦これらのチェックが完了すると, DMACはDMACがバスを使うために バスを開放するようにCPUに要求します. DMACはCPUにHRQ信号を送ってバスを要求します.

CPUはHRQ信号を検出し, 現在の指示の実行を完了します. 一旦プロセッサがバスを開放することができる状態になると, 解放を 行います. 通常は CPU により駆動される信号 (-MEMR, -MEMW, -IOR, -IOW, その他)を すべてハイインピーダンス (ハイともローとも指定しない)状態にした後, CPUは HLDA信号を有効にして DMAコントローラにバスを明け渡したことを 伝えます.

プロセッサによっては, CPUはバスを使用しないいくつかの 命令を追加して実行することもできますが, しかし,プロセッサの内部キャッシュやパイプライン以外のメモリから 何か読み出すといった指示に到達したら結局CPUは待たなくてはなりません.

ここで,DMACが バスを「託される」と, DMACはその -MEMR, -MEMW, -IOR, -IOW 出力信号をアクティブにし, DMACから出力されるアドレスは 0x3456にセットされます.これは 転送しようとする特定のメモリ番地をバイトで指示するのに使われます.

するとDMACはDMA転送をリクエストしたデバイスに転送が始まることを 知らせます.これは -DACK信号をアクティブにすることで行われます. フロッピーディスクコントローラの場合は, -DACK2を アクティブにすることで行われます.

バスのデータ線に転送されるバイトにを出力することについては フロッピーディスクコントローラが責任をもつことになります. もし,フロッピーディスクコントローラがバス上にバイトデータを 出力するのに余計な時間を必要としなければ (もし周辺装置がもっと時間を必要とする場合には, READY信号を 経由してDMACに通知します), DMAは 1 DMAクロック待ち, メモリにバス上のバイトデータを格納するために -MEMW および -IOR 信号を解除します. そして FDCはバイトデータが転送されたことを認識します.

DMAサイクルは1度に1バイトしか転送しないので, FDCはDRQ2信号を止めて, DMACに転送の終了を知らせます. DMACは-DACK2信号を解除して, FDCはバス上へのデータ出力を 停止しなくてはならないことを知らせます.

次にDMACは他のDMAチャネルのいずれかに要求がきていないか チェックを行います. もしどのチャネルのDRQも有効になっていなければ, DMAコントローラは処理を完了して, -MEMR, -MEMW, -IOR, -IOW および アドレス信号をハイインピーダンス状態にします.

最後に, DMAはHRQ信号を解除します. CPUはこれを見ると,HOLDA信号を 解除します. そしてCPUは自らの -MEMR, -MEMW, -IOR, -IOW 信号および アドレス線を有効にし, 命令の実行やメインメモリや周辺機器へのアクセスを 再開します.

典型的なフロッピーディスクの1セクタについては, 上記のプロセスが それぞれのバイトについて1回行われ, 全部で512回繰り返されます. 1バイト転送される毎に,DMAC内のアドレスレジスタはインクリメントされ, 何バイト転送すればよいかを示すカウンタがデクリメントされます.

カウンタが0になると, DMAはカウンタが0になったことを示すEOP信号を 送り, DMAコントローラがCPUによって再びプログラムされるまで これ以上データは転送されなくなります.

このイベントはターミナルカウント(TC)とも呼ばれます. EOP信号は1本しかありません. なぜならどんな時もただ1つのDMAチャネル のみをアクティブにすることができるためです.

もし, バッファの転送が完了した時に周辺機器から割り込みを発生させたい とき, 周辺機器は -DACK信号およびEOP信号の両方が同時に発信されたか どうかをテストします. それが生じると, DMACはCPUの介在がなければ これ以上はその周辺機器についての情報を転送しないことを意味します. すると周辺機器はプロセッサの注意を得るために割り込み信号のうちの1つを 発信します. DMAチップ自身は割り込みを生じさせる能力は持っていません. 周辺機器とそれに関連するハードウェアが割り込みを生成する責任を 持ちます.

DMACが要求を出したときにはCPUは常にバスをDMACに開放しますが, この動作は, DMACがアクティブになった時にプロセッサが命令を実行するのに かかる時間がわずかに変化することを除いては, アプリケーション, オペレーティングシステムの両方からはわからないということを 理解することが重要です. そのため, プロセッサが確かにDMA転送が完了したことを知るためには, 周辺装置やDMAチップ中のレジスタを調べたり,周辺装置からの割り込みを 受け取る必要があります.


FreeBSD ハンドブック : FreeBSD の内部 : DMAとはどういったものでどういう働きをするのか : DMA転送の例
Previous: DMAとはどういったものでどういう働きをするのか
Next: DMA ページレジスタ および 16メガ アドレス空間制限
FreeBSD Home Page
www@freebsd.org
Updated May 23, 1997