このページをはてなブックマークに追加このページを含むはてなブックマーク このページをlivedoor クリップに追加このページを含むlivedoor クリップ
  • 追加された行はこの色です。
  • 削除された行はこの色です。
  • DMA方式 へ行く。

*目次 [#g728385e]

#contents


*基礎知識 [#nbcb26f8]

**バス [#h22d70e9]

-バスには使用権がある。
--バスの使用権を持つ可能性があるものを''バスマスタ''という。
---例:[[CPU]]、[[DMAコントローラ]]
-バスの使用権は1度に1つのバスマスタが占有することができる。
--例えば、DMAコントローラがバス使用権を持っているときは、CPUはバスを使用できない。
-バスマスタが複数存在するときに、バス使用権の調停を行うものを''バスアービタ''という。
--バスコントローラはこのバスアービタの機能を持つ。

*DMAコントローラ [#m14c8889]

-=DMAC
-入出力装置と主記憶装置の間でデータ転送を行う。そのパターンとしては次がある。
--入出力装置に対してはバスコンロローラを経由して読み書きを行う。
--主記憶装置に対応する内蔵ROM/RAMに対しては内部バスを介して読み書きを行う。
--主記憶装置に対応する外部ROM/RAMに対してはバスコントローラを経由して読み書きを行う。

*DMA(Direct Memory Access)方式 [#s454eb6b]

 バスマスターの権限があれば、コンピュータの指揮命令系統を持つ。これにより周辺チップやメモリを支配下に置くことができる。コンピュータが起動した直後は基本的にMPUがバスマスターになる。ところが、場合によってデータの転送を高速化するために、DMAコントローラ(例えばディスプレイインタフェースに文字や画像を転送するとき)やFDコントローラ(FDとデータの読み書きをする時)にバスマスターの権限を移すことがある。

 データ量が多いとき、[[マイコン]]の[[バス]]を[[CPU]]の支配から取り上げ、一時的に他の装置がこのバスを専有して、効率を上げる。この方法を''DMA''という。つまり、DMAとは入出力制御の一種である。この場合は、CPUを通さずに、直接外部機器と[[メモリ]]の間でデータ転送を行うので、高速度で多量のデータをブロックとして転送できる。

 一方、CPUを介在させてINPUT命令、OUTPUT命令などを実行してデータ転送を行う方法を''Programmed I/O方式([[PIO方式]])''という。このときは命令語が10程度必要になり、転送周期は100[μs]前後になり、高速な転送に不向きである。つまり、入出力のための命令語などを実行することがスピード低下を招いているのである。

 よって、DMAはCPUを追放して、周辺機器([[FDD]]・[[ディスプレイ]]・[[カセットテープレコーダー]])とメモリを直結してしまうという考えである。ただし、CPUの代わりに''[[DMAコントローラ]](DMAC)''と呼ばれるハードウェアが必要である。


*DMAコントローラ [#m14c8889]

-=DMAC
-入出力装置と主記憶装置の間でデータ転送を行う。そのパターンとしては次がある。
--入出力装置に対してはバスコンロローラを経由して読み書きを行う。
--主記憶装置に対応する内蔵ROM/RAMに対しては内部バスを介して読み書きを行う。
--主記憶装置に対応する外部ROM/RAMに対してはバスコントローラを経由して読み書きを行う。



*フォン・ノイマンボトルネック [#b60c2ff6]

-DMAを使うと、通常のCPUが使うバスに加えて、バス上を流れるデータの量を増える。そのため、コントローラはバスの活動を調整する必要がある。
-優れた設計でも、要求されるデータの転送量のバスの許容転送量を超えることがある。
--これはバスを介してデータを転送する[[ノイマン型コンピュータ]]特有の問題なので、''フォン・ノイマンボトルネック''と呼ぶ。

*DMAの分類 [#aaa4ad4f]

-[[サイクルスチールDMA]]
-[[同期DMA]]


*DMAの手順 [#sf27834b]

**準備 [#d96f7d7c]

 DMA方式で転送を行うためには、転送を始める前にプログラムによる次の初期操作を必要とされる。

1:アドレスレジスタへDMA転送を開始するメモリの番地を転送する。

2:転送するデータの個数をカウンタへ転送する。カウンタの代わりにアドレスレジスタがもうひとつあるときは、DMA転送の終了メモリ番地を転送する場合もある。

3:ステータスレジスタに制御コードを転送する。制御コードとは周辺機器からメモリへデータを転送するのか(データ転送)、メモリから周辺機器へ転送するのか、DMA動作をアクティブにするのかインアクティブにするのかを、特定の位置のビットの0/1で定めるものである。

 これらの情報は、データバスを経て[[DMAコントローラ]]のレジスタに書き込まれる。


**DMA実行の一例 [#xb3e3fcc]

 周辺機器からDMAREQ(DMA Request:DMA要求信号)が、DMAコントローラに来たとする。このとき、ステータスレジスタがDMA動作のアクティブを示していれば、DMAコントローラはCPUに対してHOLD REQ信号を送信する。HOLDが許可されると、周辺機器へアクノレッジド信号DMAACKを出力する。

 データ転送がメモリへの書き込みだとすると、DMAACKが来るごとに周辺機器はデータバスに転送するべき情報を送り出す。一方、DMAコントローラはアドレスレジスタの内容をアドレスバスに送り出して、WRITE動作を示す制御線をステータスレジスタにしたがってアクティブにする。

 以上の動作のタイミングがうまくとれていれば、メモリのほうはアドレスの示すチップ内のメモリセルのデータを取り込むことになる。制御信号・データ・アドレス信号の発生源がCPUであっても、DMAコントローラであっても、[[RAM]]には関係ないことである。1つ転送するごとにDMAコントローラはカウンタの値をデクリメントするので、ゼロになれば転送を終了したことになる。なお、カウンタの代わりに終了番地を示すレジスタがある場合には、先頭番地を示すレジスタをインクリメントしていく。


**DMA転送の終了 [#z0c9f42d]

 DMA転送が終了し場合に、[[割り込み]]をかけてCPUに知らせる場合もある。

 また、初期値用の記憶レジスタを持っていれば、再度初期設定を行い、CPUが止まるまで処理を実行する場合もある。


*周辺機器が複数個存在する場合のDMA転送 [#sd9785ad]

 周辺機器が複数存在し、各々がDMA転送を要求する場合でも、原理的には一つの場合と変わらない。各DMA転送要求に対して、[[アドレスレジスタ]]、[[カウンタ]]、[[ステータスレジスタ]]をDMAコントローラの中に設けておき、初期設定のプログラムで適当な値を書き込んでおけばよいのである。

 問題はDMAREQの優先度であるが、DMAコントローラ依存になる。

-例
--Intel社の[[8257]],[[8257-5]]などのプログラマブルDMAコントローラ
---4個のDMAREQ端子を持ち、優先順位の固定ができる。
---さらに、DMAサイクルごとの優先順位の変更も可能である。


*DMA方式の注意点 [#sf301e56]

-DMAコントローラが転送処理を行う。
--そのため、ソフトウェア側は別の処理を担当できる。
--DMA転送は指定した回数・サイズで行われるため、細かいチェックはできない。つまり、単純なデータ転送のみとなる。
-データ転送にソフトウェアが介在しないため、PIO転送と比べて転送処理時間が速い。
-ソフトウェアにより[[DMAコントローラ]]に対して転送元・転送先・転送サイズを指定する必要がある。
--そのため、少量のデータ転送の場合、総時間がPIO転送より遅くなることがある。
-DMA転送の場合、DMAコントローラがデータ転送を行うためにバス使用権を取得して、CPUがバスを使用できず、結果としてソフトウェアの実行が通常よりも遅くなってしまうことも可能性としてありえる。
--特に組み込み機器の場合、複数の通信を行ったり、1マイクロ秒単位での制御を行ったり、時間のずれを制御したりすることがあるため、データ転送でバスが占有されてしまい、メイン処理が動かなくなってしまっては問題となってしまう。
--この問題を解決するためには、サイクルスチールモード((CPUがバスを使用できないときにDMA転送を行うモード。))やバーストモード((設定したデータ転送が終わるまでDMAコントローラがバス使用権を占有するモード。))でDMA転送を行うようにしたり、組み込み機器の動作に影響を与えないように転送回数を分割したりする方法が考えられる。


*参考文献 [#e9e4b912]

-『ステップ式 マイコン基礎講座』
-『学習コンピュータ 1978年2月号』
-『コンピュータサイエンス入門』