Sync with the original.

This commit is contained in:
Hiroyuki Hanai 1997-02-17 04:48:56 +00:00
parent 4bb098a0cd
commit a025037043

View File

@ -1,6 +1,6 @@
<!-- $FreeBSD$ -->
<!-- The FreeBSD Japanese Documentation Project -->
<!-- Original revision: 1.5 -->
<!-- Original revision: 1.6 -->
<!-- 日本語訳 鈴木康修 (yasu@hike.te.chiba-u.ac.jp) -->
<!--
<!DOCTYPE linuxdoc PUBLIC "-//FreeBSD//DTD linuxdoc//EN" [
@ -12,10 +12,11 @@
-->
<sect><heading>DMAとはどういったものでどういう働きをするのか <label id="dma"></heading>
<p><em>Copyright &copy; 1995 &a.uhclem;, All Rights Reserved.<newline>
18 October 1995.</em>
<p><em>原作: &a.uhclem;<newline>
<newline>訳: &a.yasu;<newline>
10 December 1996.</em>
<!-- Version 1(2) -->
<!-- Version 1(3) -->
Direct Memory Access (DMA)は, 中央演算処理装置 (CPU)からの干渉なく
データを計算機中である場所から別の場所に動かすための手法です.
@ -26,14 +27,17 @@
PCの DMAサブシステムは, Intelの 8237 DMAコントローラをベースにして
います. 8237はそれぞれ独立にプログラムできる4つのDMAチャネルを持ち,
どのチャネルもいつでもアクティブにできます.
それぞれどのチャネルもいつでもアクティブにできます.
これらのチャネルは順に 0, 1, 2, 3となっています.
PC/ATからは, セカンド 8237 チップが追加され,それらは 4, 5, 6, 7と
なっています.
オリジナルの DMAコントローラ(0, 1, 2, 3)は, 1回の転送で1バイト
転送します. セカンドDMAコントローラ(4, 5, 6, 7)は1回で 16ビット転送
します. 2つのコントローラは全く同じものであり, 転送量が異なるのは
転送します.
セカンドDMAコントローラ(4, 5, 6, 7)は1回で 隣接する2つのメモリ番地から
16ビット転送します.
ここで, 最初のバイトは通常偶数のアドレスになります.
2つのコントローラは全く同じものであり, 転送量が異なるのは
セカンドコントローラがシステムに直結しているためです.
8237 は個々のチャネルについて, DRQと-DACKという2つの電気信号を
@ -185,9 +189,9 @@
ページレジスタのラッチはDMAチップとは独立であるので,
読み込まれる又は書き込まれるメモリ領域は, 64kの物理的境界を
またいではなりません.
もしDMACがメモリの0xffff番地をアクセスすると, DMACはアドレスレジスタを
インクリメントします. 次にアクセスされるバイトは 0x0000番地に
なるでしょう. 0x10000ではありません.
DMACがメモリの0xffff番地をアクセスすると, データの転送後,
DMACはアドレスレジスタをインクリメントし, 0x0000番地にある次のバイトを
アクセスします. 0x10000番地ではありません.
これはおそらく意図されたものとは異なっているでしょう.
<quote><em>注:</em> 「物理的な」 64Kの境界を 8086モードの
@ -199,14 +203,14 @@
8ビットしか保持しません. よって8+16で24ビットになり, これは
DMAが0から16メガの間のメモリ番地しか指し示せないことを
意味します. 16メガ以上のメモリを持ったより新しいマシンにおいても,
PCコンパチブルなDMAでは16メガ以上の番地にはアクセスできません.
PCコンパチブルなDMAでは16メガ以上のメモリ番地にはアクセスできません.
この制限を避けるために, オペレーティングシステムは
16メガ以下にある物理的な64kの境界をまたがない領域にバッファを
予約します. そして, DMACはデータをそのバッファに読み出すように
プログラムされます. 一旦DMACこのバッファにデータを動かすと,
オペレーティングシステムは本当にデータを格納したいアドレスに
バッファからデータをコピーします.
予約します. そして, DMACはデータを周辺機器からそのバッファに
転送するようにプログラムされます. 一旦DMACこのバッファに
データを動かすと, オペレーティングシステムは本当にデータを
格納したいアドレスにバッファからデータをコピーします.
16メガを越えるアドレスからDMAベースの周辺機器にデータを
書き込む際には, データは16メガ以下に位置したバッファから最初に
@ -238,35 +242,36 @@
<tag>ブロック/デマンド転送モード</tag>
一旦DMACがシステムバスを取得すると, 最大64kまでのデータブロック
全体が転送されます.
もし周辺装置が余分に時間を必要とするときは, READY信号を有効に
します.
もし周辺装置が余分に時間を必要とするときは,
転送を一時中断するためにREADY信号を有効にします.
READY信号は過度に使われるべきではなく, 遅い周辺装置の転送の場合は
シングル転送モードを代わりに使うべきです.
ブロック転送モードとデマンド転送モードの違いは, 一旦ブロック転送が
始まると,転送カウンタか0になるまでそれが行われるところです.
1バイト転送するにはDRQが -DACK が有効になるまでの間だけ
有効であれば充分です.
デマンドモードはDRQが有効な間は転送が続けられます. DRQが無効に
なったことで中断された転送は, DRQがその後
有効になったときに, 転送が中断したところから再開されます.
有効であれば充分です.
デマンドモードはDRQが有効な間は転送が続けられます.
DMACが転送を一時中止した場合はバスを解放してCPUに返します.
その後、DRQが有効になると, 転送は中断したところから再開されます.
CPUを使ってデータを読み出した方が効率がよくなるくらい
CPUの速度が向上するより前の
データの転送, 特に転送に使われるメモリ番地が16Mを越える場合に,
CPUを使った方が効率がよくなるまでCPUの速度が向上する以前の
古いハードディスクコントローラはデマンドモードを使っていました.
<tag>カスケード転送モード</tag>
このメカニズムはDMAチャネルがバスを要求することを許可する
ものですが, 接続されたデバイスはバス上のアドレス情報の配置に
ついて責任を持ちます. これはいわゆる「バスマスタ」というものです.
ついてDMACに代わって責任を持ちます.
これはいわゆる「バスマスタ」というものです.
カスケードモードのDMAチャネルがバスのコントロールを受け取ると,
DMAは通常行われるようなバス上のアドレスとI/Oコントロール信号の
出力を行いません. 代わりに, DMAはこのチャネルの -DACK信号を
有効にします.
そして, アドレスとバスコントロール信号の供給は
この時点で, アドレスとバスコントロール信号の供給は
DMAチャネルに接続されたデバイスが担当します.
周辺機器はシステムバスの完全なコントロールを行い,
16メガ以下の任意のアドレスの読み込みおよび書き込みを行うことが
@ -280,12 +285,14 @@
この線は実際にはプライマリDMAコントローラのDRQ4に接続されています.
プライマリのDMAコントローラはその後 HLDREQ を使ってCPUにバスを
要求します. バスが与えられると, -DACK4が有効になり,
この線は実際にはスレーブDMAコントローラの HLDA信号に接続されています.
この線は実際にはスレーブDMAコントローラの HLDA信号に
接続されています.
スレーブDMAコントローラはその後要求したDMAチャネルに対して
データを転送するか, バスマスタリングを要求する周辺機器にバスを
許可します.
データを転送するか, SCSIコントローラのような
バスマスタリングを要求する周辺機器にバスを許可します.
このような配線がおこなわれているため, PC/ATシステムではDMAチャネルは
このような配線がおこなわれているため, PC/ATシステムでは
DMAチャネルは
0, 1, 2, 3, 5, 6, 7のみが使用できます.
<quote><em>注:</em>
@ -297,29 +304,45 @@
周辺機器がバスマスタリングを行っている時は,
システムバスを保持している間絶えずメモリにもしくはメモリから
データを転送することが重要です.もし, 周辺機器がこのように
できないときは, システムがメモリのリフレッシュを行なえるように
しばしばバスを開放しなくてはなりません.
メモリの読み込みと書き込みのサイクルはリフレッシュサイクルとして
カウントされる(リフレッシュサイクルは実際には不完全なメモリ
読み込みサイクルになります)ので,
周辺機器のコントローラが連続するメモリ番地からデータの読み込み
または書き込みを行う間は, メモリの全てをリフレッシュされます.
できないときは, システムがメインメモリのリフレッシュを
行なえるようにしばしばバスを開放しなくてはなりません.
バスマスタリングはいくつかのSCSIアダプタやその他の
ハイパフォーマンスなカードに見られます.
全てのPCでメインメモリとして使われるダイナミックRAMは,
中身が「満たされている」ビットを保持するため
頻繁にアクセスされなくてはなりません.
ダイナミックRAMは, それぞれが1ビットのデータを記憶するコンデンサが
たくさん集まって構成されています. これらのコンデンサは充電された
状態で"1", 充電されていない状態で"0"を表します.
全てのコンデンサは放電するため, "1"の値を保持するために,
一定の間隔で電力を加える必要があります.
実際にRAMチップはRAMの適切な場所に電力を送る作業を行ないますが,
メモリのリフレッシュ作業がRAMを普通にアクセスする時と
衝突しないように, それをいつ行なうかを
コンピュータが休止状態の時に知らせなくてはなりません.
もしコンピュータがメモリのリフレッシュを行なえない場合は,
メモリの中身はわずか数ミリ秒で壊れてしまいます。
メモリの読み込みと書き込みのサイクルはリフレッシュサイクルとして
カウントされる(ダイナミックRAMのリフレッシュサイクルは
実際には不完全なメモリ読み込みサイクルになります)ので,
周辺機器のコントローラが連続するメモリ番地からデータの読み込み
または書き込みを行う間は, メモリの全てがリフレッシュされます.
バスマスタリングはいくつかのSCSIホストインターフェースやその他の
ハイパフォーマンスな周辺機器コントローラに見られます.
<tag>自動初期化転送モード</tag>
このモードにおいてDMAはバイト, ブロック, デマンド転送を行いますが,
DMA転送カウンタが0になると, カウンタとアドレスはDMAチャネルが
もともとプログラムされた時のものに戻されます.
これは, デバイスが転送を要求している間は転送が続けられることを
これは, 周辺機器が転送を要求している間は転送が続けられることを
意味します.
転送領域としてDMACにプログラムされた固定バッファの中で,
出力操作でDMACがデータを読み出す前もって新しいデータを
書き込んだり入力操作でDMACが書き込んだあとに,
そこから新しいデータを読み出す作業はCPUが受け持ちます.
このテクニックは, サンプリング用のバッファが小さいもしくは
それを持たないオーディオデバイスによく使われます.
この「環状」バッファの管理は更なるCPUオーバーヘッドになりますが,
@ -332,7 +355,7 @@
<p>プログラムされるDMAチャネルは, 通常, 設定を行う前に
「マスクする」べきです.
これはハードウェアがDRQを有効にすると, たとえ全てのパラメータが
これはハードウェアが予期せずDRQを有効にすると, たとえ全てのパラメータが
満たされてない場合や更新されていない場合でも, DMACは
それに応答してしまうからです.