Merge the EN version changes, 1.8 -> 1.9.

Submitted by:	Houichi Hirose <shou@kt.rim.or.jp>
Reviewed by:	Mitsuru Iwasaki <iwasaki@jp.freebsd.org>
This commit is contained in:
Masafumi Max NAKANE 1997-10-14 03:49:10 +00:00
parent 3bbf54681d
commit 8fdaddd1ed
Notes: svn2git 2020-12-08 03:00:23 +00:00
svn path=/head/; revision=2063
2 changed files with 478 additions and 264 deletions

View file

@ -1,6 +1,6 @@
<!-- $Id: dma.sgml,v 1.7 1997-08-25 05:13:25 max Exp $ --> <!-- $Id: dma.sgml,v 1.8 1997-10-14 03:49:10 max Exp $ -->
<!-- The FreeBSD Japanese Documentation Project --> <!-- The FreeBSD Japanese Documentation Project -->
<!-- Original revision: 1.8 --> <!-- Original revision: 1.9 -->
<!-- 日本語訳 鈴木康修 (yasu@hike.te.chiba-u.ac.jp) --> <!-- 日本語訳 鈴木康修 (yasu@hike.te.chiba-u.ac.jp) -->
<!-- <!--
<!DOCTYPE linuxdoc PUBLIC "-//FreeBSD//DTD linuxdoc//EN" [ <!DOCTYPE linuxdoc PUBLIC "-//FreeBSD//DTD linuxdoc//EN" [
@ -14,7 +14,7 @@
<p><em>原作: &a.uhclem;<newline> <p><em>原作: &a.uhclem;<newline>
<newline>訳: &a.yasu;<newline> <newline>訳: &a.yasu;<newline>
10 December 1996.</em> 10 December 1996. 最終更新日 8 October 1997.</em>
<!-- Version 1(3) --> <!-- Version 1(3) -->
@ -59,24 +59,26 @@
なぜなら, CPUを使用してメモリ間のデータを動かす方が早いからです. なぜなら, CPUを使用してメモリ間のデータを動かす方が早いからです.
</quote> </quote>
PCアーキテクチャでは, それぞれのDMAチャネルは, 通常そのDMAを PCアーキテクチャでは, それぞれのDMAチャネルは, 通常
使用するハードウェアがそのチャネルについてDRQを使って 与えられたDMAチャネルを使用するハードウェアがそのチャネルについて
転送を要求した時のみ動作します. DRQ線を使って転送を要求した時のみ動作します.
<sect1><heading>DMA転送の例</heading> <sect1><heading>DMA転送の例</heading>
<p>これはDMA転送の手順の例です. <p>DMA転送の発生と処理の手順の例をあげてみましょう.
この例では, フロッピーディスクコントローラ (FDC)が この例では, フロッピーディスクコントローラ (FDC)が
ディスケットから1バイト読み込んで, DMAを使って,メモリの0x00123456番地に ディスケットから1バイト読み込んで, DMAを使って,メモリの0x00123456番地に
格納したいとします. 処理は, FDCによって, DRQ2信号を有効にして 格納したいとします. 処理は, FDCが, DRQ2信号(DMAチャンネル2に
DMAコントローラに要求を伝えることで開始します. 対するDRQ線)を有効にして
DMAコントローラに要求を伝えることで開始されます.
DMAコントローラはDRQ2シグナルが有効になったことを記録します. DMAコントローラはDRQ2シグナルが有効になったことを記録します.
するとDMAコントローラはDMAチャネル2がプログラムされ, 有効に するとDMAコントローラはDMAチャネル2がプログラムされ, マスクが
なっていることを確認します. かかっていない(有効になっている)ことを確認します.
DMAコントローラはまた, 他のDMAチャネルがアクティブでないか, または 同様に, DMAコントローラは, 他のDMAチャネルがアクティブまたは
より高い優先度を持っていないかを確認します. アクティブになろうとしていないこと, そしてより高い優先度を持って
いないことを確認します.
一旦これらのチェックが完了すると, DMACはDMACがバスを使うために 一旦これらのチェックが完了すると, DMACはDMACがバスを使うために
バスを開放するようにCPUに要求します. バスを開放するようにCPUに要求します.
DMACはCPUにHRQ信号を送ってバスを要求します. DMACはCPUにHRQ信号を送ってバスを要求します.
@ -115,7 +117,7 @@
FDCはバイトデータが転送されたことを認識します. FDCはバイトデータが転送されたことを認識します.
DMAサイクルは1度に1バイトしか転送しないので, DMAサイクルは1度に1バイトしか転送しないので,
FDCはDRQ2信号を止めて, DMACに転送の終了を知らせます. FDCはDRQ2信号を止めて, DMACに転送が終了したことを知らせます.
DMACは-DACK2信号を解除して, FDCはバス上へのデータ出力を DMACは-DACK2信号を解除して, FDCはバス上へのデータ出力を
停止しなくてはならないことを知らせます. 停止しなくてはならないことを知らせます.
@ -132,24 +134,29 @@
典型的なフロッピーディスクの1セクタについては, 上記のプロセスが 典型的なフロッピーディスクの1セクタについては, 上記のプロセスが
それぞれのバイトについて1回行われ, 全部で512回繰り返されます. それぞれのバイトについて1回行われ, 全部で512回繰り返されます.
1バイト転送される毎に,DMAC内のアドレスレジスタはインクリメントされ, 1バイト転送される毎に,DMAC内のアドレスレジスタはインクリメントされ,
何バイト転送すればよいかを示すカウンタがデクリメントされます. 同じくDMAC内にある, 何バイト転送すればよいかを示すカウンタが
デクリメントされます.
カウンタが0になると, DMAはカウンタが0になったことを示すEOP信号を カウンタが0になると, DMAはEOP信号を送ります. この信号は
送り, DMAコントローラがCPUによって再びプログラムされるまで カウンタが0であり, DMAコントローラがCPUによって再び
これ以上データは転送されなくなります. プログラムされるまで, これ以上データは転送されないことを
示すものです.
このイベントはターミナルカウント(TC)とも呼ばれます. このイベントはターミナルカウント(TC)とも呼ばれます.
EOP信号は1本しかありません. なぜならどんな時もただ1つのDMAチャネル EOP信号は1本しかありません. そして, 一度にアクティブにできる
のみをアクティブにすることができるためです. DMAチャネルは一本だけなので, 現在アクティブであるDMAチャネルこそが,
たった今処理を終了したDMAチャネルだと言うことができます.
もし, バッファの転送が完了した時に周辺機器から割り込みを発生させたい もし, バッファの転送が完了した時に周辺機器から割り込みを発生させたい
とき, 周辺機器は -DACK信号およびEOP信号の両方が同時に発信されたか とき, 周辺機器は -DACKn信号およびEOP信号の両方が同時に発信されたか
どうかをテストします. それが生じると, DMACはCPUの介在がなければ どうかをテストします. その場合, DMACはCPUの介在がなければ
これ以上はその周辺機器についての情報を転送しないことを意味します. これ以上はその周辺機器についての情報を転送しません.
すると周辺機器はプロセッサの注意を得るために割り込み信号のうちの1つを その後で, 周辺機器はプロセッサに割り込みを生じさせるために,
発信します. DMAチップ自身は割り込みを生じさせる能力は持っていません. 何らかの割り込み信号を発生させることができます. PCアーキテクチャ
においては, DMAチップ自身が割り込みを生じさせることはできません.
周辺機器とそれに関連するハードウェアが割り込みを生成する責任を 周辺機器とそれに関連するハードウェアが割り込みを生成する責任を
持ちます. 持ちます. また, DMAを使用する周辺機器が割り込みを使用しない
可能性もあります.
DMACが要求を出したときにはCPUは常にバスをDMACに開放しますが, DMACが要求を出したときにはCPUは常にバスをDMACに開放しますが,
この動作は, DMACがアクティブになった時にプロセッサが命令を実行するのに この動作は, DMACがアクティブになった時にプロセッサが命令を実行するのに
@ -173,13 +180,13 @@
IBM PCが64k以上のメモリをサポートしていたため, IBM PCが64k以上のメモリをサポートしていたため,
DMACが64kを越えるメモリ番地に読み込み又は書き込みを行うために DMACが64kを越えるメモリ番地に読み込み又は書き込みを行うために
変更を行う必要が生じました. 変更を行う必要が生じました.
この問題を解決するためにIBMが行ったのは, それぞれのDMAチャネルに この問題を解決するためにIBMが行ったのは, それぞれのDMAチャネルに,
ついてラッチを追加することでした. つまり, 読み込む又は書き込む先 読み込み元または書き込み先のアドレスの上位ビットを保持するため
アドレスの上位ビットに保持するためのものです. 外部的なラッチを追加することでした.
DMAチャネルがアクティブな時はいつでも, DMAチャネルがアクティブな時はいつでも,
このラッチの内容はアドレスバスに書かれて, そのチャネルのDMA操作が このラッチの内容はアドレスバスに書かれて, そのチャネルのDMA操作が
終了するまでそこに保持されます. 終了するまでそこに保持されます.
これらのラッチは「ページレジスタ」と呼ばれます. IBMはこれらのラッチを「ページレジスタ」と呼んでいます.
そのため上記に示した例では, DMACはアドレスの0x3456の部分をバス上に そのため上記に示した例では, DMACはアドレスの0x3456の部分をバス上に
置き, DMAチャネル2に対するページレジスタは, 0x0012xxxxをバス上に 置き, DMAチャネル2に対するページレジスタは, 0x0012xxxxをバス上に
@ -188,25 +195,27 @@
ページレジスタのラッチはDMAチップとは独立であるので, ページレジスタのラッチはDMAチップとは独立であるので,
読み込まれる又は書き込まれるメモリ領域は, 64kの物理的境界を 読み込まれる又は書き込まれるメモリ領域は, 64kの物理的境界を
またいではなりません. またいではなりません. 例えば, もし
DMACがメモリの0xffff番地をアクセスすると, データの転送後, DMACがメモリの0xffff番地をアクセスした場合, データの転送後,
DMACはアドレスレジスタをインクリメントし, 0x0000番地にある次のバイトを DMACはアドレスレジスタをインクリメントし, 0x0000番地にある次のバイトを
アクセスします. 0x10000番地ではありません. アクセスします. 0x10000番地ではありません.
これはおそらく意図されたものとは異なっているでしょう. これはおそらく意図されたものとは異なっているでしょう.
<quote><em>注:</em> 「物理的な」 64Kの境界を 8086モードの <quote><em>注:</em> 「物理的な」 64Kの境界を 8086モードの
64k「セグメント」と混同してはいけません. セグメントは, セグメント 64k「セグメント」と混同してはいけません. セグメントは, セグメント
レジスタにオフセットレジスタを加算して作られるものです. レジスタに数学的にオフセットレジスタを加算して作られるものです.
ページレジスタにはアドレスのオーバーラップはありません. </quote> ページレジスタにはアドレスのオーバーラップも無く,数学的に
ORを取られることもありません. </quote>
さらに複雑なことには, PC/ATでは外部のDMAアドレスのラッチは さらに複雑なことには, PC/ATでは外部のDMAアドレスのラッチは
8ビットしか保持しません. よって8+16で24ビットになり, これは 8ビットしか保持しません. よって8+16で24ビットになり, これは
DMAが0から16メガの間のメモリ番地しか指し示せないことを DMAが0から16メガの間のメモリ番地しか指し示せないことを
意味します. 16メガ以上のメモリを持ったより新しいマシンにおいても, 意味します. 16メガ以上のメモリを持ったより新しいマシンにおいても,
PCコンパチブルなDMAでは16メガ以上のメモリ番地にはアクセスできません. 標準的なPCコンパチブルなDMAでは16メガ以上のメモリ番地には
アクセスできません.
この制限を避けるために, オペレーティングシステムは この制限を避けるために, オペレーティングシステムは
16メガ以下にある物理的な64kの境界をまたがない領域にバッファを 16メガ以下にある物理的な64kの境界をまたがない領域にRAMバッファを
予約します. そして, DMACはデータを周辺機器からそのバッファに 予約します. そして, DMACはデータを周辺機器からそのバッファに
転送するようにプログラムされます. 一旦DMACがこのバッファに 転送するようにプログラムされます. 一旦DMACがこのバッファに
データを動かすと, オペレーティングシステムは本当にデータを データを動かすと, オペレーティングシステムは本当にデータを
@ -219,6 +228,10 @@
「バウンスバッファ」と呼ばれます. MS-DOSの世界では, 「バウンスバッファ」と呼ばれます. MS-DOSの世界では,
これらは「スマートバッファ」などと呼ばれます. これらは「スマートバッファ」などと呼ばれます.
<quote><em>注意:</em> 82374と呼ばれる8237の新しい実装においては,
ページレジスタを16ビットで指定して, バウンスバッファを使用しなくても,
32ビットのアドレス空間全体にアクセスすることが可能です.
<sect1><heading>DMA操作モードとその設定</heading> <sect1><heading>DMA操作モードとその設定</heading>
@ -235,8 +248,8 @@
よって使用されます. よって使用されます.
周辺装置は次の転送の準備ができる毎にDMAを要求します. 周辺装置は次の転送の準備ができる毎にDMAを要求します.
フロッピーディスクコントローラは1バイトのバッファしか持たないので, 標準的なPCコンパチブルなフロッピーディスクコントローラ(NEC 765)は
このモードを使用します. 1バイトのバッファしか持たないので, このモードを使用します.
<tag>ブロック/デマンド転送モード</tag> <tag>ブロック/デマンド転送モード</tag>
@ -249,10 +262,10 @@
ブロック転送モードとデマンド転送モードの違いは, 一旦ブロック転送が ブロック転送モードとデマンド転送モードの違いは, 一旦ブロック転送が
始まると,転送カウンタか0になるまでそれが行われるところです. 始まると,転送カウンタか0になるまでそれが行われるところです.
1バイト転送するにはDRQが -DACK が有効になるまでの間だけ DRQは-DACKが有効になるまでの間は有効でなければなりません.
有効であれば充分です. デマンドモードはDRQが有効な間転送が続けられます.
デマンドモードはDRQが有効な間は転送が続けられます. DRQが有効でなくなった場合, DMAはその時点で転送を中断し,
DMACが転送を一時中止した場合はバスを解放してCPUに返します. バスを解放してCPUに返します.
その後、DRQが有効になると, 転送は中断したところから再開されます. その後、DRQが有効になると, 転送は中断したところから再開されます.
データの転送, 特に転送に使われるメモリ番地が16Mを越える場合に, データの転送, 特に転送に使われるメモリ番地が16Mを越える場合に,
@ -264,35 +277,38 @@
このメカニズムはDMAチャネルがバスを要求することを許可する このメカニズムはDMAチャネルがバスを要求することを許可する
ものですが, 接続されたデバイスはバス上のアドレス情報の配置に ものですが, 接続されたデバイスはバス上のアドレス情報の配置に
ついてDMACに代わって責任を持ちます. ついてDMACに代わって責任を持ちます.
これはいわゆる「バスマスタ」というものです. これは「バスマスタ」と呼ばれる技術の実装に利用されます.
カスケードモードのDMAチャネルがバスのコントロールを受け取ると, カスケードモードのDMAチャネルがバスのコントロールを受け取ると,
DMAは通常行われるようなバス上のアドレスとI/Oコントロール信号の DMAは通常行われるようなバス上のアドレスとI/Oコントロール信号の
出力を行いません. 代わりに, DMAはこのチャネルの -DACK信号を 出力を行いません. 代わりに, DMAはアクティブなチャネルの -DACK信号を
有効にします. 有効にします.
この時点で, アドレスとバスコントロール信号の供給は この時点で, アドレスとバスコントロール信号の供給は
DMAチャネルに接続されたデバイスが担当します. DMAチャネルに接続された周辺機器が担当します.
周辺機器はシステムバスの完全なコントロールを行い, 周辺機器はシステムバスの完全なコントロールを行い,
16メガ以下の任意のアドレスの読み込みおよび書き込みを行うことが 16メガ以下の任意のアドレスの読み込みおよび書き込みを行うことが
できます. 周辺機器はバスの使用を終えると, DRQ線を無効にして, できます. 周辺機器はバスの使用を終えるとDRQ線を無効にするので,
DMAコントローラはCPUもしくは他のDMAチャネルに制御を返します. DMAコントローラはCPUもしくは他のDMAチャネルに制御を返すことが
できます.
カスケードモードは複数のDMAコントローラを相互接続するのに カスケードモードは複数のDMAコントローラを相互接続するのに
使われます. PC内ではDMAチャネル4がまさにこの用途に使われています. 使われます. PC内ではDMAチャネル4がまさにこの用途に使われています.
周辺機器がDMAチャネル0, 1, 2, 3でバスを要求すると, 周辺機器がDMAチャネル0, 1, 2, 3でバスを要求すると,
スレーブDMAコントローラは HLDREQ を有効にしますが, スレーブDMAコントローラは HLDREQ を有効にしますが,
この線は実際にはプライマリDMAコントローラのDRQ4に接続されています. この線はCPUではなく, 実際にはプライマリDMAコントローラのDRQ4に
プライマリのDMAコントローラはその後 HLDREQ を使ってCPUにバスを 接続されています.
要求します. バスが与えられると, -DACK4が有効になり, その後, チャンネル4になにか仕事があるものと見なしたプライマリの
DMAコントローラは HLDREQ を使ってCPUにバスを
要求します. バスが与えられると, -DACK4が有効になりますが,
この線は実際にはスレーブDMAコントローラの HLDA信号に この線は実際にはスレーブDMAコントローラの HLDA信号に
接続されています. 接続されています.
スレーブDMAコントローラはその後要求したDMAチャネルに対して スレーブDMAコントローラはその後要求したDMAチャネル
データを転送するか, SCSIコントローラのような (0, 1, 2, 3) に対してデータを転送するか, SCSIコントローラのような
バスマスタリングを要求する周辺機器にバスを許可します. バスマスタリングを要求する周辺機器にバスを許可します.
このような配線がおこなわれているため, PC/ATシステムでは このような配線がおこなわれているため, PC/ATシステム
DMAチャネルは 周辺機器ではDMAチャネルは
0, 1, 2, 3, 5, 6, 7のみが使用できます. 0, 1, 2, 3, 5, 6, 7のみが使用できます.
<quote><em>注:</em> <quote><em>注:</em>
@ -355,9 +371,10 @@
<p>プログラムされるDMAチャネルは, 通常, 設定を行う前に <p>プログラムされるDMAチャネルは, 通常, 設定を行う前に
「マスクする」べきです. 「マスクする」べきです.
これはハードウェアが予期せずDRQを有効にすると, たとえ全てのパラメータが これはハードウェアが予期せずそのチャンネルに対してDRQを有効に
した場合, たとえ全てのパラメータが
満たされてない場合や更新されていない場合でも, DMACは 満たされてない場合や更新されていない場合でも, DMACは
それに応答してしまうからです. それに応答してしまう可能性があるからです.
マスクを行ってから,ホストは転送の方向(メモリからI/O, マスクを行ってから,ホストは転送の方向(メモリからI/O,
もしくはI/Oからメモリ)と, 転送に使用するDMA操作のモード もしくはI/Oからメモリ)と, 転送に使用するDMA操作のモード
@ -373,14 +390,14 @@
I/Oポートの別のセットを通してアクセスされます. I/Oポートの別のセットを通してアクセスされます.
すべての設定ができると, DMAチャネルはマスクを解除することができます. すべての設定ができると, DMAチャネルはマスクを解除することができます.
そのDMAチャネルは「準備ができた」とみなされ, DRQが有効になると そのDMAチャネルは「準備ができた」とみなされ, そのチャンネルのDRQが
応答します. 有効になると応答します.
8237のプログラミングの正確な詳細については, 8237のプログラミングの正確な詳細については,
ハードウェアデータブックを参照してください. ハードウェアデータブックを参照してください.
PCシステムにおけるI/Oマップについても参照する必要があるでしょう. PCシステムにおけるI/Oマップについても参照する必要があるでしょう.
このマップにはDMAおよびページレジスタのポートがどこに位置するのかを このマップにはDMAおよびページレジスタのポートがどこに位置するのかを
書いてあります. 以下に完全なを示します. 書いてあります. 以下に完全なポートのマップテーブルを示します.
<sect1><heading>DMAポートのマップ</heading> <sect1><heading>DMAポートのマップ</heading>
@ -395,46 +412,46 @@
<p>DMA アドレス および カウントレジスタ <p>DMA アドレス および カウントレジスタ
<verb> <verb>
0x00 write Channel 0 starting address 0x00 write Channel 0 starting address
0x00 read Channel 0 current address 0x00 read Channel 0 current address
0x02 write Channel 0 starting word count 0x01 write Channel 0 starting word count
0x02 read Channel 0 remaining word count 0x01 read Channel 0 remaining word count
0x04 write Channel 1 starting address 0x02 write Channel 1 starting address
0x04 read Channel 1 current address 0x02 read Channel 1 current address
0x06 write Channel 1 starting word count 0x03 write Channel 1 starting word count
0x06 read Channel 1 remaining word count 0x03 read Channel 1 remaining word count
0x08 write Channel 2 starting address 0x04 write Channel 2 starting address
0x08 read Channel 2 current address 0x04 read Channel 2 current address
0x0a write Channel 2 starting word count 0x05 write Channel 2 starting word count
0x0a read Channel 2 remaining word count 0x05 read Channel 2 remaining word count
0x0c write Channel 3 starting address 0x06 write Channel 3 starting address
0x0c read Channel 3 current address 0x06 read Channel 3 current address
0x0e write Channel 3 starting word count 0x07 write Channel 3 starting word count
0x0e read Channel 3 remaining word count 0x07 read Channel 3 remaining word count
</verb> </verb>
DMA コマンドレジスタ DMA コマンドレジスタ
<verb> <verb>
0x10 write Command Register 0x08 write Command Register
0x10 read Status Register 0x08 read Status Register
0x12 write Request Register 0x09 write Request Register
0x12 read - 0x09 read -
0x14 write Single Mask Register Bit 0x0a write Single Mask Register Bit
0x14 read - 0x0a read -
0x16 write Mode Register 0x0b write Mode Register
0x16 read - 0x0b read -
0x18 write Clear LSB/MSB Flip-Flop 0x0c write Clear LSB/MSB Flip-Flop
0x18 read - 0x0c read -
0x1a write Master Clear/Reset 0x0d write Master Clear/Reset
0x1a read Temporary Register 0x0d read Temporary Register (新しいバージョンでは利用不可)
0x1c write Clear Mask Register 0x0e write Clear Mask Register
0x1c read - 0x0e read -
0x1e write Write All Mask Register Bits 0x0f write Write All Mask Register Bits
0x1e read - 0x0f read Read All Mask Register Bits (Intel 82374にのみ存在する)
</verb> </verb>
<sect2><heading>0xc0 - 0xdf DMA コントローラ &num;2 (Channels 4, 5, 6 and 7)</heading> <sect2><heading>0xc0 - 0xdf DMA コントローラ &num;2 (Channels 4, 5, 6 and 7)</heading>
@ -442,60 +459,150 @@ DMA
<p>DMA アドレス および カウントレジスタ <p>DMA アドレス および カウントレジスタ
<verb> <verb>
0xc0 write Channel 4 starting address 0xc0 write Channel 4 starting address
0xc0 read Channel 4 current address 0xc0 read Channel 4 current address
0xc2 write Channel 4 starting word count 0xc2 write Channel 4 starting word count
0xc2 read Channel 4 remaining word count 0xc2 read Channel 4 remaining word count
0xc4 write Channel 5 starting address 0xc4 write Channel 5 starting address
0xc4 read Channel 5 current address 0xc4 read Channel 5 current address
0xc6 write Channel 5 starting word count 0xc6 write Channel 5 starting word count
0xc6 read Channel 5 remaining word count 0xc6 read Channel 5 remaining word count
0xc8 write Channel 6 starting address 0xc8 write Channel 6 starting address
0xc8 read Channel 6 current address 0xc8 read Channel 6 current address
0xca write Channel 6 starting word count 0xca write Channel 6 starting word count
0xca read Channel 6 remaining word count 0xca read Channel 6 remaining word count
0xcc write Channel 7 starting address 0xcc write Channel 7 starting address
0xcc read Channel 7 current address 0xcc read Channel 7 current address
0xce write Channel 7 starting word count 0xce write Channel 7 starting word count
0xce read Channel 7 remaining word count 0xce read Channel 7 remaining word count
</verb> </verb>
DMA コマンドレジスタ DMA コマンドレジスタ
<verb> <verb>
0xd0 write Command Register 0xd0 write Command Register
0xd0 read Status Register 0xd0 read Status Register
0xd2 write Request Register 0xd2 write Request Register
0xd2 read - 0xd2 read -
0xd4 write Single Mask Register Bit 0xd4 write Single Mask Register Bit
0xd4 read - 0xd4 read -
0xd6 write Mode Register 0xd6 write Mode Register
0xd6 read - 0xd6 read -
0xd8 write Clear LSB/MSB Flip-Flop 0xd8 write Clear LSB/MSB Flip-Flop
0xd8 read - 0xd8 read -
0xda write Master Clear/Reset 0xda write Master Clear/Reset
0xda read Temporary Register 0xda read Temporary Register (Intel 82374には存在しない)
0xdc write Clear Mask Register 0xdc write Clear Mask Register
0xdc read - 0xdc read -
0xde write Write All Mask Register Bits 0xde write Write All Mask Register Bits
0xde read - 0xdf read Read All Mask Register Bits (Intel 82374にのみ存在する)
0xdf read Read All Mask Register Bits
</verb> </verb>
<sect2><heading>0x80 - 0x9f DMA ページレジスタ</heading> <sect2><heading>0x80 - 0x9f DMA ページレジスタ</heading>
<p><verb> <p><verb>
0x87 r/w DMA Channel 0 0x87 r/w Channel 0 Low byte (23-16) page Register
0x83 r/w DMA Channel 1 0x83 r/w Channel 1 Low byte (23-16) page Register
0x81 r/w DMA Channel 2 0x81 r/w Channel 2 Low byte (23-16) page Register
0x82 r/w DMA Channel 3 0x82 r/w Channel 3 Low byte (23-16) page Register
0x8b r/w DMA Channel 5 0x8b r/w Channel 5 Low byte (23-16) page Register
0x89 r/w DMA Channel 6 0x89 r/w Channel 6 Low byte (23-16) page Register
0x8a r/w DMA Channel 7 0x8a r/w Channel 7 Low byte (23-16) page Register
0x8f r/w Low byte page Refresh
0x8f Refresh </verb>
<sect2><heading>0x400 - 0x4ff 82374 Enhanced DMA Registers</heading>
<p>
Intel 82374 EISA System Component (ESC)は1996年の初めに発表されました. この中
には機能的には8237のスーパーセットであり, 1つのパッケージの中にその他の
PC互換機のコアとなる周辺コンポーネントをも含んだDMAコントローラも含まれています.
このチップはEISAとPCI両方のプラットホームをターゲットにしたものであり,
scatter-gather I/O やリングバッファを始めとして, システムDMAをして32ビットの
アドレス空間全体に直接アクセスする能力も提供しています.
<p>
これらの機能を使用する場合でも, 過去16年間のPC互換機で利用されてきた
同等機能を提供するコードも含めておく必要があります. 互換性の問題から, 82374の
レジスタの一部は, 従来の8237のレジスタをプログラムした<em>後</em>に,
転送の度にプログラムされる必要があります. 8237のレジスタに書き込みを行うとき,
ソフトウェアの下位互換性のために, 82374で追加された一部のレジスタの内容が
強制的に0にクリアされるからです.
<p><verb>
0x401 r/w Channel 0 High byte (bits 23-16) word count
0x403 r/w Channel 1 High byte (bits 23-16) word count
0x405 r/w Channel 2 High byte (bits 23-16) word count
0x407 r/w Channel 3 High byte (bits 23-16) word count
0x4c6 r/w Channel 5 High byte (bits 23-16) word count
0x4ca r/w Channel 6 High byte (bits 23-16) word count
0x4ce r/w Channel 7 High byte (bits 23-16) word count
0x487 r/w Channel 0 High byte (bits 31-24) page Register
0x483 r/w Channel 1 High byte (bits 31-24) page Register
0x481 r/w Channel 2 High byte (bits 31-24) page Register
0x482 r/w Channel 3 High byte (bits 31-24) page Register
0x48b r/w Channel 5 High byte (bits 31-24) page Register
0x489 r/w Channel 6 High byte (bits 31-24) page Register
0x48a r/w Channel 6 High byte (bits 31-24) page Register
0x48f r/w High byte page Refresh
0x4e0 r/w Channel 0 Stop Register (bits 7-2)
0x4e1 r/w Channel 0 Stop Register (bits 15-8)
0x4e2 r/w Channel 0 Stop Register (bits 23-16)
0x4e4 r/w Channel 1 Stop Register (bits 7-2)
0x4e5 r/w Channel 1 Stop Register (bits 15-8)
0x4e6 r/w Channel 1 Stop Register (bits 23-16)
0x4e8 r/w Channel 2 Stop Register (bits 7-2)
0x4e9 r/w Channel 2 Stop Register (bits 15-8)
0x4ea r/w Channel 2 Stop Register (bits 23-16)
0x4ec r/w Channel 3 Stop Register (bits 7-2)
0x4ed r/w Channel 3 Stop Register (bits 15-8)
0x4ee r/w Channel 3 Stop Register (bits 23-16)
0x4f4 r/w Channel 5 Stop Register (bits 7-2)
0x4f5 r/w Channel 5 Stop Register (bits 15-8)
0x4f6 r/w Channel 5 Stop Register (bits 23-16)
0x4f8 r/w Channel 6 Stop Register (bits 7-2)
0x4f9 r/w Channel 6 Stop Register (bits 15-8)
0x4fa r/w Channel 6 Stop Register (bits 23-16)
0x4fc r/w Channel 7 Stop Register (bits 7-2)
0x4fd r/w Channel 7 Stop Register (bits 15-8)
0x4fe r/w Channel 7 Stop Register (bits 23-16)
0x40a write Channels 0-3 Chaining Mode Register
0x40a read Channel Interrupt Status Register
0x4d4 write Channels 4-7 Chaining Mode Register
0x4d4 read Chaining Mode Status
0x40c read Chain Buffer Expiration Control Register
0x410 write Channel 0 Scatter-Gather Command Register
0x411 write Channel 1 Scatter-Gather Command Register
0x412 write Channel 2 Scatter-Gather Command Register
0x413 write Channel 3 Scatter-Gather Command Register
0x415 write Channel 5 Scatter-Gather Command Register
0x416 write Channel 6 Scatter-Gather Command Register
0x417 write Channel 7 Scatter-Gather Command Register
0x418 read Channel 0 Scatter-Gather Status Register
0x419 read Channel 1 Scatter-Gather Status Register
0x41a read Channel 2 Scatter-Gather Status Register
0x41b read Channel 3 Scatter-Gather Status Register
0x41d read Channel 5 Scatter-Gather Status Register
0x41e read Channel 5 Scatter-Gather Status Register
0x41f read Channel 7 Scatter-Gather Status Register
0x420-0x423 r/w Channel 0 Scatter-Gather Descripter Table Pointer Register
0x424-0x427 r/w Channel 1 Scatter-Gather Descripter Table Pointer Register
0x428-0x42b r/w Channel 2 Scatter-Gather Descripter Table Pointer Register
0x42c-0x42f r/w Channel 3 Scatter-Gather Descripter Table Pointer Register
0x434-0x437 r/w Channel 5 Scatter-Gather Descripter Table Pointer Register
0x438-0x43b r/w Channel 6 Scatter-Gather Descripter Table Pointer Register
0x43c-0x43f r/w Channel 7 Scatter-Gather Descripter Table Pointer Register
</verb> </verb>

View file

@ -1,6 +1,6 @@
<!-- $Id: dma.sgml,v 1.7 1997-08-25 05:13:25 max Exp $ --> <!-- $Id: dma.sgml,v 1.8 1997-10-14 03:49:10 max Exp $ -->
<!-- The FreeBSD Japanese Documentation Project --> <!-- The FreeBSD Japanese Documentation Project -->
<!-- Original revision: 1.8 --> <!-- Original revision: 1.9 -->
<!-- 日本語訳 鈴木康修 (yasu@hike.te.chiba-u.ac.jp) --> <!-- 日本語訳 鈴木康修 (yasu@hike.te.chiba-u.ac.jp) -->
<!-- <!--
<!DOCTYPE linuxdoc PUBLIC "-//FreeBSD//DTD linuxdoc//EN" [ <!DOCTYPE linuxdoc PUBLIC "-//FreeBSD//DTD linuxdoc//EN" [
@ -14,7 +14,7 @@
<p><em>原作: &a.uhclem;<newline> <p><em>原作: &a.uhclem;<newline>
<newline>訳: &a.yasu;<newline> <newline>訳: &a.yasu;<newline>
10 December 1996.</em> 10 December 1996. 最終更新日 8 October 1997.</em>
<!-- Version 1(3) --> <!-- Version 1(3) -->
@ -59,24 +59,26 @@
なぜなら, CPUを使用してメモリ間のデータを動かす方が早いからです. なぜなら, CPUを使用してメモリ間のデータを動かす方が早いからです.
</quote> </quote>
PCアーキテクチャでは, それぞれのDMAチャネルは, 通常そのDMAを PCアーキテクチャでは, それぞれのDMAチャネルは, 通常
使用するハードウェアがそのチャネルについてDRQを使って 与えられたDMAチャネルを使用するハードウェアがそのチャネルについて
転送を要求した時のみ動作します. DRQ線を使って転送を要求した時のみ動作します.
<sect1><heading>DMA転送の例</heading> <sect1><heading>DMA転送の例</heading>
<p>これはDMA転送の手順の例です. <p>DMA転送の発生と処理の手順の例をあげてみましょう.
この例では, フロッピーディスクコントローラ (FDC)が この例では, フロッピーディスクコントローラ (FDC)が
ディスケットから1バイト読み込んで, DMAを使って,メモリの0x00123456番地に ディスケットから1バイト読み込んで, DMAを使って,メモリの0x00123456番地に
格納したいとします. 処理は, FDCによって, DRQ2信号を有効にして 格納したいとします. 処理は, FDCが, DRQ2信号(DMAチャンネル2に
DMAコントローラに要求を伝えることで開始します. 対するDRQ線)を有効にして
DMAコントローラに要求を伝えることで開始されます.
DMAコントローラはDRQ2シグナルが有効になったことを記録します. DMAコントローラはDRQ2シグナルが有効になったことを記録します.
するとDMAコントローラはDMAチャネル2がプログラムされ, 有効に するとDMAコントローラはDMAチャネル2がプログラムされ, マスクが
なっていることを確認します. かかっていない(有効になっている)ことを確認します.
DMAコントローラはまた, 他のDMAチャネルがアクティブでないか, または 同様に, DMAコントローラは, 他のDMAチャネルがアクティブまたは
より高い優先度を持っていないかを確認します. アクティブになろうとしていないこと, そしてより高い優先度を持って
いないことを確認します.
一旦これらのチェックが完了すると, DMACはDMACがバスを使うために 一旦これらのチェックが完了すると, DMACはDMACがバスを使うために
バスを開放するようにCPUに要求します. バスを開放するようにCPUに要求します.
DMACはCPUにHRQ信号を送ってバスを要求します. DMACはCPUにHRQ信号を送ってバスを要求します.
@ -115,7 +117,7 @@
FDCはバイトデータが転送されたことを認識します. FDCはバイトデータが転送されたことを認識します.
DMAサイクルは1度に1バイトしか転送しないので, DMAサイクルは1度に1バイトしか転送しないので,
FDCはDRQ2信号を止めて, DMACに転送の終了を知らせます. FDCはDRQ2信号を止めて, DMACに転送が終了したことを知らせます.
DMACは-DACK2信号を解除して, FDCはバス上へのデータ出力を DMACは-DACK2信号を解除して, FDCはバス上へのデータ出力を
停止しなくてはならないことを知らせます. 停止しなくてはならないことを知らせます.
@ -132,24 +134,29 @@
典型的なフロッピーディスクの1セクタについては, 上記のプロセスが 典型的なフロッピーディスクの1セクタについては, 上記のプロセスが
それぞれのバイトについて1回行われ, 全部で512回繰り返されます. それぞれのバイトについて1回行われ, 全部で512回繰り返されます.
1バイト転送される毎に,DMAC内のアドレスレジスタはインクリメントされ, 1バイト転送される毎に,DMAC内のアドレスレジスタはインクリメントされ,
何バイト転送すればよいかを示すカウンタがデクリメントされます. 同じくDMAC内にある, 何バイト転送すればよいかを示すカウンタが
デクリメントされます.
カウンタが0になると, DMAはカウンタが0になったことを示すEOP信号を カウンタが0になると, DMAはEOP信号を送ります. この信号は
送り, DMAコントローラがCPUによって再びプログラムされるまで カウンタが0であり, DMAコントローラがCPUによって再び
これ以上データは転送されなくなります. プログラムされるまで, これ以上データは転送されないことを
示すものです.
このイベントはターミナルカウント(TC)とも呼ばれます. このイベントはターミナルカウント(TC)とも呼ばれます.
EOP信号は1本しかありません. なぜならどんな時もただ1つのDMAチャネル EOP信号は1本しかありません. そして, 一度にアクティブにできる
のみをアクティブにすることができるためです. DMAチャネルは一本だけなので, 現在アクティブであるDMAチャネルこそが,
たった今処理を終了したDMAチャネルだと言うことができます.
もし, バッファの転送が完了した時に周辺機器から割り込みを発生させたい もし, バッファの転送が完了した時に周辺機器から割り込みを発生させたい
とき, 周辺機器は -DACK信号およびEOP信号の両方が同時に発信されたか とき, 周辺機器は -DACKn信号およびEOP信号の両方が同時に発信されたか
どうかをテストします. それが生じると, DMACはCPUの介在がなければ どうかをテストします. その場合, DMACはCPUの介在がなければ
これ以上はその周辺機器についての情報を転送しないことを意味します. これ以上はその周辺機器についての情報を転送しません.
すると周辺機器はプロセッサの注意を得るために割り込み信号のうちの1つを その後で, 周辺機器はプロセッサに割り込みを生じさせるために,
発信します. DMAチップ自身は割り込みを生じさせる能力は持っていません. 何らかの割り込み信号を発生させることができます. PCアーキテクチャ
においては, DMAチップ自身が割り込みを生じさせることはできません.
周辺機器とそれに関連するハードウェアが割り込みを生成する責任を 周辺機器とそれに関連するハードウェアが割り込みを生成する責任を
持ちます. 持ちます. また, DMAを使用する周辺機器が割り込みを使用しない
可能性もあります.
DMACが要求を出したときにはCPUは常にバスをDMACに開放しますが, DMACが要求を出したときにはCPUは常にバスをDMACに開放しますが,
この動作は, DMACがアクティブになった時にプロセッサが命令を実行するのに この動作は, DMACがアクティブになった時にプロセッサが命令を実行するのに
@ -173,13 +180,13 @@
IBM PCが64k以上のメモリをサポートしていたため, IBM PCが64k以上のメモリをサポートしていたため,
DMACが64kを越えるメモリ番地に読み込み又は書き込みを行うために DMACが64kを越えるメモリ番地に読み込み又は書き込みを行うために
変更を行う必要が生じました. 変更を行う必要が生じました.
この問題を解決するためにIBMが行ったのは, それぞれのDMAチャネルに この問題を解決するためにIBMが行ったのは, それぞれのDMAチャネルに,
ついてラッチを追加することでした. つまり, 読み込む又は書き込む先 読み込み元または書き込み先のアドレスの上位ビットを保持するため
アドレスの上位ビットに保持するためのものです. 外部的なラッチを追加することでした.
DMAチャネルがアクティブな時はいつでも, DMAチャネルがアクティブな時はいつでも,
このラッチの内容はアドレスバスに書かれて, そのチャネルのDMA操作が このラッチの内容はアドレスバスに書かれて, そのチャネルのDMA操作が
終了するまでそこに保持されます. 終了するまでそこに保持されます.
これらのラッチは「ページレジスタ」と呼ばれます. IBMはこれらのラッチを「ページレジスタ」と呼んでいます.
そのため上記に示した例では, DMACはアドレスの0x3456の部分をバス上に そのため上記に示した例では, DMACはアドレスの0x3456の部分をバス上に
置き, DMAチャネル2に対するページレジスタは, 0x0012xxxxをバス上に 置き, DMAチャネル2に対するページレジスタは, 0x0012xxxxをバス上に
@ -188,25 +195,27 @@
ページレジスタのラッチはDMAチップとは独立であるので, ページレジスタのラッチはDMAチップとは独立であるので,
読み込まれる又は書き込まれるメモリ領域は, 64kの物理的境界を 読み込まれる又は書き込まれるメモリ領域は, 64kの物理的境界を
またいではなりません. またいではなりません. 例えば, もし
DMACがメモリの0xffff番地をアクセスすると, データの転送後, DMACがメモリの0xffff番地をアクセスした場合, データの転送後,
DMACはアドレスレジスタをインクリメントし, 0x0000番地にある次のバイトを DMACはアドレスレジスタをインクリメントし, 0x0000番地にある次のバイトを
アクセスします. 0x10000番地ではありません. アクセスします. 0x10000番地ではありません.
これはおそらく意図されたものとは異なっているでしょう. これはおそらく意図されたものとは異なっているでしょう.
<quote><em>注:</em> 「物理的な」 64Kの境界を 8086モードの <quote><em>注:</em> 「物理的な」 64Kの境界を 8086モードの
64k「セグメント」と混同してはいけません. セグメントは, セグメント 64k「セグメント」と混同してはいけません. セグメントは, セグメント
レジスタにオフセットレジスタを加算して作られるものです. レジスタに数学的にオフセットレジスタを加算して作られるものです.
ページレジスタにはアドレスのオーバーラップはありません. </quote> ページレジスタにはアドレスのオーバーラップも無く,数学的に
ORを取られることもありません. </quote>
さらに複雑なことには, PC/ATでは外部のDMAアドレスのラッチは さらに複雑なことには, PC/ATでは外部のDMAアドレスのラッチは
8ビットしか保持しません. よって8+16で24ビットになり, これは 8ビットしか保持しません. よって8+16で24ビットになり, これは
DMAが0から16メガの間のメモリ番地しか指し示せないことを DMAが0から16メガの間のメモリ番地しか指し示せないことを
意味します. 16メガ以上のメモリを持ったより新しいマシンにおいても, 意味します. 16メガ以上のメモリを持ったより新しいマシンにおいても,
PCコンパチブルなDMAでは16メガ以上のメモリ番地にはアクセスできません. 標準的なPCコンパチブルなDMAでは16メガ以上のメモリ番地には
アクセスできません.
この制限を避けるために, オペレーティングシステムは この制限を避けるために, オペレーティングシステムは
16メガ以下にある物理的な64kの境界をまたがない領域にバッファを 16メガ以下にある物理的な64kの境界をまたがない領域にRAMバッファを
予約します. そして, DMACはデータを周辺機器からそのバッファに 予約します. そして, DMACはデータを周辺機器からそのバッファに
転送するようにプログラムされます. 一旦DMACがこのバッファに 転送するようにプログラムされます. 一旦DMACがこのバッファに
データを動かすと, オペレーティングシステムは本当にデータを データを動かすと, オペレーティングシステムは本当にデータを
@ -219,6 +228,10 @@
「バウンスバッファ」と呼ばれます. MS-DOSの世界では, 「バウンスバッファ」と呼ばれます. MS-DOSの世界では,
これらは「スマートバッファ」などと呼ばれます. これらは「スマートバッファ」などと呼ばれます.
<quote><em>注意:</em> 82374と呼ばれる8237の新しい実装においては,
ページレジスタを16ビットで指定して, バウンスバッファを使用しなくても,
32ビットのアドレス空間全体にアクセスすることが可能です.
<sect1><heading>DMA操作モードとその設定</heading> <sect1><heading>DMA操作モードとその設定</heading>
@ -235,8 +248,8 @@
よって使用されます. よって使用されます.
周辺装置は次の転送の準備ができる毎にDMAを要求します. 周辺装置は次の転送の準備ができる毎にDMAを要求します.
フロッピーディスクコントローラは1バイトのバッファしか持たないので, 標準的なPCコンパチブルなフロッピーディスクコントローラ(NEC 765)は
このモードを使用します. 1バイトのバッファしか持たないので, このモードを使用します.
<tag>ブロック/デマンド転送モード</tag> <tag>ブロック/デマンド転送モード</tag>
@ -249,10 +262,10 @@
ブロック転送モードとデマンド転送モードの違いは, 一旦ブロック転送が ブロック転送モードとデマンド転送モードの違いは, 一旦ブロック転送が
始まると,転送カウンタか0になるまでそれが行われるところです. 始まると,転送カウンタか0になるまでそれが行われるところです.
1バイト転送するにはDRQが -DACK が有効になるまでの間だけ DRQは-DACKが有効になるまでの間は有効でなければなりません.
有効であれば充分です. デマンドモードはDRQが有効な間転送が続けられます.
デマンドモードはDRQが有効な間は転送が続けられます. DRQが有効でなくなった場合, DMAはその時点で転送を中断し,
DMACが転送を一時中止した場合はバスを解放してCPUに返します. バスを解放してCPUに返します.
その後、DRQが有効になると, 転送は中断したところから再開されます. その後、DRQが有効になると, 転送は中断したところから再開されます.
データの転送, 特に転送に使われるメモリ番地が16Mを越える場合に, データの転送, 特に転送に使われるメモリ番地が16Mを越える場合に,
@ -264,35 +277,38 @@
このメカニズムはDMAチャネルがバスを要求することを許可する このメカニズムはDMAチャネルがバスを要求することを許可する
ものですが, 接続されたデバイスはバス上のアドレス情報の配置に ものですが, 接続されたデバイスはバス上のアドレス情報の配置に
ついてDMACに代わって責任を持ちます. ついてDMACに代わって責任を持ちます.
これはいわゆる「バスマスタ」というものです. これは「バスマスタ」と呼ばれる技術の実装に利用されます.
カスケードモードのDMAチャネルがバスのコントロールを受け取ると, カスケードモードのDMAチャネルがバスのコントロールを受け取ると,
DMAは通常行われるようなバス上のアドレスとI/Oコントロール信号の DMAは通常行われるようなバス上のアドレスとI/Oコントロール信号の
出力を行いません. 代わりに, DMAはこのチャネルの -DACK信号を 出力を行いません. 代わりに, DMAはアクティブなチャネルの -DACK信号を
有効にします. 有効にします.
この時点で, アドレスとバスコントロール信号の供給は この時点で, アドレスとバスコントロール信号の供給は
DMAチャネルに接続されたデバイスが担当します. DMAチャネルに接続された周辺機器が担当します.
周辺機器はシステムバスの完全なコントロールを行い, 周辺機器はシステムバスの完全なコントロールを行い,
16メガ以下の任意のアドレスの読み込みおよび書き込みを行うことが 16メガ以下の任意のアドレスの読み込みおよび書き込みを行うことが
できます. 周辺機器はバスの使用を終えると, DRQ線を無効にして, できます. 周辺機器はバスの使用を終えるとDRQ線を無効にするので,
DMAコントローラはCPUもしくは他のDMAチャネルに制御を返します. DMAコントローラはCPUもしくは他のDMAチャネルに制御を返すことが
できます.
カスケードモードは複数のDMAコントローラを相互接続するのに カスケードモードは複数のDMAコントローラを相互接続するのに
使われます. PC内ではDMAチャネル4がまさにこの用途に使われています. 使われます. PC内ではDMAチャネル4がまさにこの用途に使われています.
周辺機器がDMAチャネル0, 1, 2, 3でバスを要求すると, 周辺機器がDMAチャネル0, 1, 2, 3でバスを要求すると,
スレーブDMAコントローラは HLDREQ を有効にしますが, スレーブDMAコントローラは HLDREQ を有効にしますが,
この線は実際にはプライマリDMAコントローラのDRQ4に接続されています. この線はCPUではなく, 実際にはプライマリDMAコントローラのDRQ4に
プライマリのDMAコントローラはその後 HLDREQ を使ってCPUにバスを 接続されています.
要求します. バスが与えられると, -DACK4が有効になり, その後, チャンネル4になにか仕事があるものと見なしたプライマリの
DMAコントローラは HLDREQ を使ってCPUにバスを
要求します. バスが与えられると, -DACK4が有効になりますが,
この線は実際にはスレーブDMAコントローラの HLDA信号に この線は実際にはスレーブDMAコントローラの HLDA信号に
接続されています. 接続されています.
スレーブDMAコントローラはその後要求したDMAチャネルに対して スレーブDMAコントローラはその後要求したDMAチャネル
データを転送するか, SCSIコントローラのような (0, 1, 2, 3) に対してデータを転送するか, SCSIコントローラのような
バスマスタリングを要求する周辺機器にバスを許可します. バスマスタリングを要求する周辺機器にバスを許可します.
このような配線がおこなわれているため, PC/ATシステムでは このような配線がおこなわれているため, PC/ATシステム
DMAチャネルは 周辺機器ではDMAチャネルは
0, 1, 2, 3, 5, 6, 7のみが使用できます. 0, 1, 2, 3, 5, 6, 7のみが使用できます.
<quote><em>注:</em> <quote><em>注:</em>
@ -355,9 +371,10 @@
<p>プログラムされるDMAチャネルは, 通常, 設定を行う前に <p>プログラムされるDMAチャネルは, 通常, 設定を行う前に
「マスクする」べきです. 「マスクする」べきです.
これはハードウェアが予期せずDRQを有効にすると, たとえ全てのパラメータが これはハードウェアが予期せずそのチャンネルに対してDRQを有効に
した場合, たとえ全てのパラメータが
満たされてない場合や更新されていない場合でも, DMACは 満たされてない場合や更新されていない場合でも, DMACは
それに応答してしまうからです. それに応答してしまう可能性があるからです.
マスクを行ってから,ホストは転送の方向(メモリからI/O, マスクを行ってから,ホストは転送の方向(メモリからI/O,
もしくはI/Oからメモリ)と, 転送に使用するDMA操作のモード もしくはI/Oからメモリ)と, 転送に使用するDMA操作のモード
@ -373,14 +390,14 @@
I/Oポートの別のセットを通してアクセスされます. I/Oポートの別のセットを通してアクセスされます.
すべての設定ができると, DMAチャネルはマスクを解除することができます. すべての設定ができると, DMAチャネルはマスクを解除することができます.
そのDMAチャネルは「準備ができた」とみなされ, DRQが有効になると そのDMAチャネルは「準備ができた」とみなされ, そのチャンネルのDRQが
応答します. 有効になると応答します.
8237のプログラミングの正確な詳細については, 8237のプログラミングの正確な詳細については,
ハードウェアデータブックを参照してください. ハードウェアデータブックを参照してください.
PCシステムにおけるI/Oマップについても参照する必要があるでしょう. PCシステムにおけるI/Oマップについても参照する必要があるでしょう.
このマップにはDMAおよびページレジスタのポートがどこに位置するのかを このマップにはDMAおよびページレジスタのポートがどこに位置するのかを
書いてあります. 以下に完全なを示します. 書いてあります. 以下に完全なポートのマップテーブルを示します.
<sect1><heading>DMAポートのマップ</heading> <sect1><heading>DMAポートのマップ</heading>
@ -395,46 +412,46 @@
<p>DMA アドレス および カウントレジスタ <p>DMA アドレス および カウントレジスタ
<verb> <verb>
0x00 write Channel 0 starting address 0x00 write Channel 0 starting address
0x00 read Channel 0 current address 0x00 read Channel 0 current address
0x02 write Channel 0 starting word count 0x01 write Channel 0 starting word count
0x02 read Channel 0 remaining word count 0x01 read Channel 0 remaining word count
0x04 write Channel 1 starting address 0x02 write Channel 1 starting address
0x04 read Channel 1 current address 0x02 read Channel 1 current address
0x06 write Channel 1 starting word count 0x03 write Channel 1 starting word count
0x06 read Channel 1 remaining word count 0x03 read Channel 1 remaining word count
0x08 write Channel 2 starting address 0x04 write Channel 2 starting address
0x08 read Channel 2 current address 0x04 read Channel 2 current address
0x0a write Channel 2 starting word count 0x05 write Channel 2 starting word count
0x0a read Channel 2 remaining word count 0x05 read Channel 2 remaining word count
0x0c write Channel 3 starting address 0x06 write Channel 3 starting address
0x0c read Channel 3 current address 0x06 read Channel 3 current address
0x0e write Channel 3 starting word count 0x07 write Channel 3 starting word count
0x0e read Channel 3 remaining word count 0x07 read Channel 3 remaining word count
</verb> </verb>
DMA コマンドレジスタ DMA コマンドレジスタ
<verb> <verb>
0x10 write Command Register 0x08 write Command Register
0x10 read Status Register 0x08 read Status Register
0x12 write Request Register 0x09 write Request Register
0x12 read - 0x09 read -
0x14 write Single Mask Register Bit 0x0a write Single Mask Register Bit
0x14 read - 0x0a read -
0x16 write Mode Register 0x0b write Mode Register
0x16 read - 0x0b read -
0x18 write Clear LSB/MSB Flip-Flop 0x0c write Clear LSB/MSB Flip-Flop
0x18 read - 0x0c read -
0x1a write Master Clear/Reset 0x0d write Master Clear/Reset
0x1a read Temporary Register 0x0d read Temporary Register (新しいバージョンでは利用不可)
0x1c write Clear Mask Register 0x0e write Clear Mask Register
0x1c read - 0x0e read -
0x1e write Write All Mask Register Bits 0x0f write Write All Mask Register Bits
0x1e read - 0x0f read Read All Mask Register Bits (Intel 82374にのみ存在する)
</verb> </verb>
<sect2><heading>0xc0 - 0xdf DMA コントローラ &num;2 (Channels 4, 5, 6 and 7)</heading> <sect2><heading>0xc0 - 0xdf DMA コントローラ &num;2 (Channels 4, 5, 6 and 7)</heading>
@ -442,60 +459,150 @@ DMA
<p>DMA アドレス および カウントレジスタ <p>DMA アドレス および カウントレジスタ
<verb> <verb>
0xc0 write Channel 4 starting address 0xc0 write Channel 4 starting address
0xc0 read Channel 4 current address 0xc0 read Channel 4 current address
0xc2 write Channel 4 starting word count 0xc2 write Channel 4 starting word count
0xc2 read Channel 4 remaining word count 0xc2 read Channel 4 remaining word count
0xc4 write Channel 5 starting address 0xc4 write Channel 5 starting address
0xc4 read Channel 5 current address 0xc4 read Channel 5 current address
0xc6 write Channel 5 starting word count 0xc6 write Channel 5 starting word count
0xc6 read Channel 5 remaining word count 0xc6 read Channel 5 remaining word count
0xc8 write Channel 6 starting address 0xc8 write Channel 6 starting address
0xc8 read Channel 6 current address 0xc8 read Channel 6 current address
0xca write Channel 6 starting word count 0xca write Channel 6 starting word count
0xca read Channel 6 remaining word count 0xca read Channel 6 remaining word count
0xcc write Channel 7 starting address 0xcc write Channel 7 starting address
0xcc read Channel 7 current address 0xcc read Channel 7 current address
0xce write Channel 7 starting word count 0xce write Channel 7 starting word count
0xce read Channel 7 remaining word count 0xce read Channel 7 remaining word count
</verb> </verb>
DMA コマンドレジスタ DMA コマンドレジスタ
<verb> <verb>
0xd0 write Command Register 0xd0 write Command Register
0xd0 read Status Register 0xd0 read Status Register
0xd2 write Request Register 0xd2 write Request Register
0xd2 read - 0xd2 read -
0xd4 write Single Mask Register Bit 0xd4 write Single Mask Register Bit
0xd4 read - 0xd4 read -
0xd6 write Mode Register 0xd6 write Mode Register
0xd6 read - 0xd6 read -
0xd8 write Clear LSB/MSB Flip-Flop 0xd8 write Clear LSB/MSB Flip-Flop
0xd8 read - 0xd8 read -
0xda write Master Clear/Reset 0xda write Master Clear/Reset
0xda read Temporary Register 0xda read Temporary Register (Intel 82374には存在しない)
0xdc write Clear Mask Register 0xdc write Clear Mask Register
0xdc read - 0xdc read -
0xde write Write All Mask Register Bits 0xde write Write All Mask Register Bits
0xde read - 0xdf read Read All Mask Register Bits (Intel 82374にのみ存在する)
0xdf read Read All Mask Register Bits
</verb> </verb>
<sect2><heading>0x80 - 0x9f DMA ページレジスタ</heading> <sect2><heading>0x80 - 0x9f DMA ページレジスタ</heading>
<p><verb> <p><verb>
0x87 r/w DMA Channel 0 0x87 r/w Channel 0 Low byte (23-16) page Register
0x83 r/w DMA Channel 1 0x83 r/w Channel 1 Low byte (23-16) page Register
0x81 r/w DMA Channel 2 0x81 r/w Channel 2 Low byte (23-16) page Register
0x82 r/w DMA Channel 3 0x82 r/w Channel 3 Low byte (23-16) page Register
0x8b r/w DMA Channel 5 0x8b r/w Channel 5 Low byte (23-16) page Register
0x89 r/w DMA Channel 6 0x89 r/w Channel 6 Low byte (23-16) page Register
0x8a r/w DMA Channel 7 0x8a r/w Channel 7 Low byte (23-16) page Register
0x8f r/w Low byte page Refresh
0x8f Refresh </verb>
<sect2><heading>0x400 - 0x4ff 82374 Enhanced DMA Registers</heading>
<p>
Intel 82374 EISA System Component (ESC)は1996年の初めに発表されました. この中
には機能的には8237のスーパーセットであり, 1つのパッケージの中にその他の
PC互換機のコアとなる周辺コンポーネントをも含んだDMAコントローラも含まれています.
このチップはEISAとPCI両方のプラットホームをターゲットにしたものであり,
scatter-gather I/O やリングバッファを始めとして, システムDMAをして32ビットの
アドレス空間全体に直接アクセスする能力も提供しています.
<p>
これらの機能を使用する場合でも, 過去16年間のPC互換機で利用されてきた
同等機能を提供するコードも含めておく必要があります. 互換性の問題から, 82374の
レジスタの一部は, 従来の8237のレジスタをプログラムした<em>後</em>に,
転送の度にプログラムされる必要があります. 8237のレジスタに書き込みを行うとき,
ソフトウェアの下位互換性のために, 82374で追加された一部のレジスタの内容が
強制的に0にクリアされるからです.
<p><verb>
0x401 r/w Channel 0 High byte (bits 23-16) word count
0x403 r/w Channel 1 High byte (bits 23-16) word count
0x405 r/w Channel 2 High byte (bits 23-16) word count
0x407 r/w Channel 3 High byte (bits 23-16) word count
0x4c6 r/w Channel 5 High byte (bits 23-16) word count
0x4ca r/w Channel 6 High byte (bits 23-16) word count
0x4ce r/w Channel 7 High byte (bits 23-16) word count
0x487 r/w Channel 0 High byte (bits 31-24) page Register
0x483 r/w Channel 1 High byte (bits 31-24) page Register
0x481 r/w Channel 2 High byte (bits 31-24) page Register
0x482 r/w Channel 3 High byte (bits 31-24) page Register
0x48b r/w Channel 5 High byte (bits 31-24) page Register
0x489 r/w Channel 6 High byte (bits 31-24) page Register
0x48a r/w Channel 6 High byte (bits 31-24) page Register
0x48f r/w High byte page Refresh
0x4e0 r/w Channel 0 Stop Register (bits 7-2)
0x4e1 r/w Channel 0 Stop Register (bits 15-8)
0x4e2 r/w Channel 0 Stop Register (bits 23-16)
0x4e4 r/w Channel 1 Stop Register (bits 7-2)
0x4e5 r/w Channel 1 Stop Register (bits 15-8)
0x4e6 r/w Channel 1 Stop Register (bits 23-16)
0x4e8 r/w Channel 2 Stop Register (bits 7-2)
0x4e9 r/w Channel 2 Stop Register (bits 15-8)
0x4ea r/w Channel 2 Stop Register (bits 23-16)
0x4ec r/w Channel 3 Stop Register (bits 7-2)
0x4ed r/w Channel 3 Stop Register (bits 15-8)
0x4ee r/w Channel 3 Stop Register (bits 23-16)
0x4f4 r/w Channel 5 Stop Register (bits 7-2)
0x4f5 r/w Channel 5 Stop Register (bits 15-8)
0x4f6 r/w Channel 5 Stop Register (bits 23-16)
0x4f8 r/w Channel 6 Stop Register (bits 7-2)
0x4f9 r/w Channel 6 Stop Register (bits 15-8)
0x4fa r/w Channel 6 Stop Register (bits 23-16)
0x4fc r/w Channel 7 Stop Register (bits 7-2)
0x4fd r/w Channel 7 Stop Register (bits 15-8)
0x4fe r/w Channel 7 Stop Register (bits 23-16)
0x40a write Channels 0-3 Chaining Mode Register
0x40a read Channel Interrupt Status Register
0x4d4 write Channels 4-7 Chaining Mode Register
0x4d4 read Chaining Mode Status
0x40c read Chain Buffer Expiration Control Register
0x410 write Channel 0 Scatter-Gather Command Register
0x411 write Channel 1 Scatter-Gather Command Register
0x412 write Channel 2 Scatter-Gather Command Register
0x413 write Channel 3 Scatter-Gather Command Register
0x415 write Channel 5 Scatter-Gather Command Register
0x416 write Channel 6 Scatter-Gather Command Register
0x417 write Channel 7 Scatter-Gather Command Register
0x418 read Channel 0 Scatter-Gather Status Register
0x419 read Channel 1 Scatter-Gather Status Register
0x41a read Channel 2 Scatter-Gather Status Register
0x41b read Channel 3 Scatter-Gather Status Register
0x41d read Channel 5 Scatter-Gather Status Register
0x41e read Channel 5 Scatter-Gather Status Register
0x41f read Channel 7 Scatter-Gather Status Register
0x420-0x423 r/w Channel 0 Scatter-Gather Descripter Table Pointer Register
0x424-0x427 r/w Channel 1 Scatter-Gather Descripter Table Pointer Register
0x428-0x42b r/w Channel 2 Scatter-Gather Descripter Table Pointer Register
0x42c-0x42f r/w Channel 3 Scatter-Gather Descripter Table Pointer Register
0x434-0x437 r/w Channel 5 Scatter-Gather Descripter Table Pointer Register
0x438-0x43b r/w Channel 6 Scatter-Gather Descripter Table Pointer Register
0x43c-0x43f r/w Channel 7 Scatter-Gather Descripter Table Pointer Register
</verb> </verb>