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 -->
<!-- Original revision: 1.8 -->
<!-- Original revision: 1.9 -->
<!-- 日本語訳 鈴木康修 (yasu@hike.te.chiba-u.ac.jp) -->
<!--
<!DOCTYPE linuxdoc PUBLIC "-//FreeBSD//DTD linuxdoc//EN" [
@ -14,7 +14,7 @@
<p><em>原作: &a.uhclem;<newline>
<newline>訳: &a.yasu;<newline>
10 December 1996.</em>
10 December 1996. 最終更新日 8 October 1997.</em>
<!-- Version 1(3) -->
@ -59,24 +59,26 @@
なぜなら, CPUを使用してメモリ間のデータを動かす方が早いからです.
</quote>
PCアーキテクチャでは, それぞれのDMAチャネルは, 通常そのDMAを
使用するハードウェアがそのチャネルについてDRQを使って
転送を要求した時のみ動作します.
PCアーキテクチャでは, それぞれのDMAチャネルは, 通常
与えられたDMAチャネルを使用するハードウェアがそのチャネルについて
DRQ線を使って転送を要求した時のみ動作します.
<sect1><heading>DMA転送の例</heading>
<p>これはDMA転送の手順の例です.
<p>DMA転送の発生と処理の手順の例をあげてみましょう.
この例では, フロッピーディスクコントローラ (FDC)が
ディスケットから1バイト読み込んで, DMAを使って,メモリの0x00123456番地に
格納したいとします. 処理は, FDCによって, DRQ2信号を有効にして
DMAコントローラに要求を伝えることで開始します.
格納したいとします. 処理は, FDCが, DRQ2信号(DMAチャンネル2に
対するDRQ線)を有効にして
DMAコントローラに要求を伝えることで開始されます.
DMAコントローラはDRQ2シグナルが有効になったことを記録します.
するとDMAコントローラはDMAチャネル2がプログラムされ, 有効に
なっていることを確認します.
DMAコントローラはまた, 他のDMAチャネルがアクティブでないか, または
より高い優先度を持っていないかを確認します.
するとDMAコントローラはDMAチャネル2がプログラムされ, マスクが
かかっていない(有効になっている)ことを確認します.
同様に, DMAコントローラは, 他のDMAチャネルがアクティブまたは
アクティブになろうとしていないこと, そしてより高い優先度を持って
いないことを確認します.
一旦これらのチェックが完了すると, DMACはDMACがバスを使うために
バスを開放するようにCPUに要求します.
DMACはCPUにHRQ信号を送ってバスを要求します.
@ -115,7 +117,7 @@
FDCはバイトデータが転送されたことを認識します.
DMAサイクルは1度に1バイトしか転送しないので,
FDCはDRQ2信号を止めて, DMACに転送の終了を知らせます.
FDCはDRQ2信号を止めて, DMACに転送が終了したことを知らせます.
DMACは-DACK2信号を解除して, FDCはバス上へのデータ出力を
停止しなくてはならないことを知らせます.
@ -132,24 +134,29 @@
典型的なフロッピーディスクの1セクタについては, 上記のプロセスが
それぞれのバイトについて1回行われ, 全部で512回繰り返されます.
1バイト転送される毎に,DMAC内のアドレスレジスタはインクリメントされ,
何バイト転送すればよいかを示すカウンタがデクリメントされます.
同じくDMAC内にある, 何バイト転送すればよいかを示すカウンタが
デクリメントされます.
カウンタが0になると, DMAはカウンタが0になったことを示すEOP信号を
送り, DMAコントローラがCPUによって再びプログラムされるまで
これ以上データは転送されなくなります.
カウンタが0になると, DMAはEOP信号を送ります. この信号は
カウンタが0であり, DMAコントローラがCPUによって再び
プログラムされるまで, これ以上データは転送されないことを
示すものです.
このイベントはターミナルカウント(TC)とも呼ばれます.
EOP信号は1本しかありません. なぜならどんな時もただ1つのDMAチャネル
のみをアクティブにすることができるためです.
EOP信号は1本しかありません. そして, 一度にアクティブにできる
DMAチャネルは一本だけなので, 現在アクティブであるDMAチャネルこそが,
たった今処理を終了したDMAチャネルだと言うことができます.
もし, バッファの転送が完了した時に周辺機器から割り込みを発生させたい
とき, 周辺機器は -DACK信号およびEOP信号の両方が同時に発信されたか
どうかをテストします. それが生じると, DMACはCPUの介在がなければ
これ以上はその周辺機器についての情報を転送しないことを意味します.
すると周辺機器はプロセッサの注意を得るために割り込み信号のうちの1つを
発信します. DMAチップ自身は割り込みを生じさせる能力は持っていません.
とき, 周辺機器は -DACKn信号およびEOP信号の両方が同時に発信されたか
どうかをテストします. その場合, DMACはCPUの介在がなければ
これ以上はその周辺機器についての情報を転送しません.
その後で, 周辺機器はプロセッサに割り込みを生じさせるために,
何らかの割り込み信号を発生させることができます. PCアーキテクチャ
においては, DMAチップ自身が割り込みを生じさせることはできません.
周辺機器とそれに関連するハードウェアが割り込みを生成する責任を
持ちます.
持ちます. また, DMAを使用する周辺機器が割り込みを使用しない
可能性もあります.
DMACが要求を出したときにはCPUは常にバスをDMACに開放しますが,
この動作は, DMACがアクティブになった時にプロセッサが命令を実行するのに
@ -173,13 +180,13 @@
IBM PCが64k以上のメモリをサポートしていたため,
DMACが64kを越えるメモリ番地に読み込み又は書き込みを行うために
変更を行う必要が生じました.
この問題を解決するためにIBMが行ったのは, それぞれのDMAチャネルに
ついてラッチを追加することでした. つまり, 読み込む又は書き込む先
アドレスの上位ビットに保持するためのものです.
この問題を解決するためにIBMが行ったのは, それぞれのDMAチャネルに,
読み込み元または書き込み先のアドレスの上位ビットを保持するため
外部的なラッチを追加することでした.
DMAチャネルがアクティブな時はいつでも,
このラッチの内容はアドレスバスに書かれて, そのチャネルのDMA操作が
終了するまでそこに保持されます.
これらのラッチは「ページレジスタ」と呼ばれます.
IBMはこれらのラッチを「ページレジスタ」と呼んでいます.
そのため上記に示した例では, DMACはアドレスの0x3456の部分をバス上に
置き, DMAチャネル2に対するページレジスタは, 0x0012xxxxをバス上に
@ -188,25 +195,27 @@
ページレジスタのラッチはDMAチップとは独立であるので,
読み込まれる又は書き込まれるメモリ領域は, 64kの物理的境界を
またいではなりません.
DMACがメモリの0xffff番地をアクセスすると, データの転送後,
またいではなりません. 例えば, もし
DMACがメモリの0xffff番地をアクセスした場合, データの転送後,
DMACはアドレスレジスタをインクリメントし, 0x0000番地にある次のバイトを
アクセスします. 0x10000番地ではありません.
これはおそらく意図されたものとは異なっているでしょう.
<quote><em>注:</em> 「物理的な」 64Kの境界を 8086モードの
64k「セグメント」と混同してはいけません. セグメントは, セグメント
レジスタにオフセットレジスタを加算して作られるものです.
ページレジスタにはアドレスのオーバーラップはありません. </quote>
レジスタに数学的にオフセットレジスタを加算して作られるものです.
ページレジスタにはアドレスのオーバーラップも無く,数学的に
ORを取られることもありません. </quote>
さらに複雑なことには, PC/ATでは外部のDMAアドレスのラッチは
8ビットしか保持しません. よって8+16で24ビットになり, これは
DMAが0から16メガの間のメモリ番地しか指し示せないことを
意味します. 16メガ以上のメモリを持ったより新しいマシンにおいても,
PCコンパチブルなDMAでは16メガ以上のメモリ番地にはアクセスできません.
標準的なPCコンパチブルなDMAでは16メガ以上のメモリ番地には
アクセスできません.
この制限を避けるために, オペレーティングシステムは
16メガ以下にある物理的な64kの境界をまたがない領域にバッファを
16メガ以下にある物理的な64kの境界をまたがない領域にRAMバッファを
予約します. そして, DMACはデータを周辺機器からそのバッファに
転送するようにプログラムされます. 一旦DMACがこのバッファに
データを動かすと, オペレーティングシステムは本当にデータを
@ -219,6 +228,10 @@
「バウンスバッファ」と呼ばれます. MS-DOSの世界では,
これらは「スマートバッファ」などと呼ばれます.
<quote><em>注意:</em> 82374と呼ばれる8237の新しい実装においては,
ページレジスタを16ビットで指定して, バウンスバッファを使用しなくても,
32ビットのアドレス空間全体にアクセスすることが可能です.
<sect1><heading>DMA操作モードとその設定</heading>
@ -235,8 +248,8 @@
よって使用されます.
周辺装置は次の転送の準備ができる毎にDMAを要求します.
フロッピーディスクコントローラは1バイトのバッファしか持たないので,
このモードを使用します.
標準的なPCコンパチブルなフロッピーディスクコントローラ(NEC 765)は
1バイトのバッファしか持たないので, このモードを使用します.
<tag>ブロック/デマンド転送モード</tag>
@ -249,10 +262,10 @@
ブロック転送モードとデマンド転送モードの違いは, 一旦ブロック転送が
始まると,転送カウンタか0になるまでそれが行われるところです.
1バイト転送するにはDRQが -DACK が有効になるまでの間だけ
有効であれば充分です.
デマンドモードはDRQが有効な間は転送が続けられます.
DMACが転送を一時中止した場合はバスを解放してCPUに返します.
DRQは-DACKが有効になるまでの間は有効でなければなりません.
デマンドモードはDRQが有効な間転送が続けられます.
DRQが有効でなくなった場合, DMAはその時点で転送を中断し,
バスを解放してCPUに返します.
その後、DRQが有効になると, 転送は中断したところから再開されます.
データの転送, 特に転送に使われるメモリ番地が16Mを越える場合に,
@ -264,35 +277,38 @@
このメカニズムはDMAチャネルがバスを要求することを許可する
ものですが, 接続されたデバイスはバス上のアドレス情報の配置に
ついてDMACに代わって責任を持ちます.
これはいわゆる「バスマスタ」というものです.
これは「バスマスタ」と呼ばれる技術の実装に利用されます.
カスケードモードのDMAチャネルがバスのコントロールを受け取ると,
DMAは通常行われるようなバス上のアドレスとI/Oコントロール信号の
出力を行いません. 代わりに, DMAはこのチャネルの -DACK信号を
出力を行いません. 代わりに, DMAはアクティブなチャネルの -DACK信号を
有効にします.
この時点で, アドレスとバスコントロール信号の供給は
DMAチャネルに接続されたデバイスが担当します.
DMAチャネルに接続された周辺機器が担当します.
周辺機器はシステムバスの完全なコントロールを行い,
16メガ以下の任意のアドレスの読み込みおよび書き込みを行うことが
できます. 周辺機器はバスの使用を終えると, DRQ線を無効にして,
DMAコントローラはCPUもしくは他のDMAチャネルに制御を返します.
できます. 周辺機器はバスの使用を終えるとDRQ線を無効にするので,
DMAコントローラはCPUもしくは他のDMAチャネルに制御を返すことが
できます.
カスケードモードは複数のDMAコントローラを相互接続するのに
使われます. PC内ではDMAチャネル4がまさにこの用途に使われています.
周辺機器がDMAチャネル0, 1, 2, 3でバスを要求すると,
スレーブDMAコントローラは HLDREQ を有効にしますが,
この線は実際にはプライマリDMAコントローラのDRQ4に接続されています.
プライマリのDMAコントローラはその後 HLDREQ を使ってCPUにバスを
要求します. バスが与えられると, -DACK4が有効になり,
この線はCPUではなく, 実際にはプライマリDMAコントローラのDRQ4に
接続されています.
その後, チャンネル4になにか仕事があるものと見なしたプライマリの
DMAコントローラは HLDREQ を使ってCPUにバスを
要求します. バスが与えられると, -DACK4が有効になりますが,
この線は実際にはスレーブDMAコントローラの HLDA信号に
接続されています.
スレーブDMAコントローラはその後要求したDMAチャネルに対して
データを転送するか, SCSIコントローラのような
スレーブDMAコントローラはその後要求したDMAチャネル
(0, 1, 2, 3) に対してデータを転送するか, SCSIコントローラのような
バスマスタリングを要求する周辺機器にバスを許可します.
このような配線がおこなわれているため, PC/ATシステムでは
DMAチャネルは
このような配線がおこなわれているため, PC/ATシステム
周辺機器ではDMAチャネルは
0, 1, 2, 3, 5, 6, 7のみが使用できます.
<quote><em>注:</em>
@ -355,9 +371,10 @@
<p>プログラムされるDMAチャネルは, 通常, 設定を行う前に
「マスクする」べきです.
これはハードウェアが予期せずDRQを有効にすると, たとえ全てのパラメータが
これはハードウェアが予期せずそのチャンネルに対してDRQを有効に
した場合, たとえ全てのパラメータが
満たされてない場合や更新されていない場合でも, DMACは
それに応答してしまうからです.
それに応答してしまう可能性があるからです.
マスクを行ってから,ホストは転送の方向(メモリからI/O,
もしくはI/Oからメモリ)と, 転送に使用するDMA操作のモード
@ -373,14 +390,14 @@
I/Oポートの別のセットを通してアクセスされます.
すべての設定ができると, DMAチャネルはマスクを解除することができます.
そのDMAチャネルは「準備ができた」とみなされ, DRQが有効になると
応答します.
そのDMAチャネルは「準備ができた」とみなされ, そのチャンネルのDRQが
有効になると応答します.
8237のプログラミングの正確な詳細については,
ハードウェアデータブックを参照してください.
PCシステムにおけるI/Oマップについても参照する必要があるでしょう.
このマップにはDMAおよびページレジスタのポートがどこに位置するのかを
書いてあります. 以下に完全なを示します.
書いてあります. 以下に完全なポートのマップテーブルを示します.
<sect1><heading>DMAポートのマップ</heading>
@ -397,44 +414,44 @@
<verb>
0x00 write Channel 0 starting address
0x00 read Channel 0 current address
0x02 write Channel 0 starting word count
0x02 read Channel 0 remaining word count
0x01 write Channel 0 starting word count
0x01 read Channel 0 remaining word count
0x04 write Channel 1 starting address
0x04 read Channel 1 current address
0x06 write Channel 1 starting word count
0x06 read Channel 1 remaining word count
0x02 write Channel 1 starting address
0x02 read Channel 1 current address
0x03 write Channel 1 starting word count
0x03 read Channel 1 remaining word count
0x08 write Channel 2 starting address
0x08 read Channel 2 current address
0x0a write Channel 2 starting word count
0x0a read Channel 2 remaining word count
0x04 write Channel 2 starting address
0x04 read Channel 2 current address
0x05 write Channel 2 starting word count
0x05 read Channel 2 remaining word count
0x0c write Channel 3 starting address
0x0c read Channel 3 current address
0x0e write Channel 3 starting word count
0x0e read Channel 3 remaining word count
0x06 write Channel 3 starting address
0x06 read Channel 3 current address
0x07 write Channel 3 starting word count
0x07 read Channel 3 remaining word count
</verb>
DMA コマンドレジスタ
<verb>
0x10 write Command Register
0x10 read Status Register
0x12 write Request Register
0x12 read -
0x14 write Single Mask Register Bit
0x14 read -
0x16 write Mode Register
0x16 read -
0x18 write Clear LSB/MSB Flip-Flop
0x18 read -
0x1a write Master Clear/Reset
0x1a read Temporary Register
0x1c write Clear Mask Register
0x1c read -
0x1e write Write All Mask Register Bits
0x1e read -
0x08 write Command Register
0x08 read Status Register
0x09 write Request Register
0x09 read -
0x0a write Single Mask Register Bit
0x0a read -
0x0b write Mode Register
0x0b read -
0x0c write Clear LSB/MSB Flip-Flop
0x0c read -
0x0d write Master Clear/Reset
0x0d read Temporary Register (新しいバージョンでは利用不可)
0x0e write Clear Mask Register
0x0e read -
0x0f write Write All Mask Register Bits
0x0f read Read All Mask Register Bits (Intel 82374にのみ存在する)
</verb>
<sect2><heading>0xc0 - 0xdf DMA コントローラ &num;2 (Channels 4, 5, 6 and 7)</heading>
@ -477,25 +494,115 @@ DMA
0xd8 write Clear LSB/MSB Flip-Flop
0xd8 read -
0xda write Master Clear/Reset
0xda read Temporary Register
0xda read Temporary Register (Intel 82374には存在しない)
0xdc write Clear Mask Register
0xdc read -
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>
<sect2><heading>0x80 - 0x9f DMA ページレジスタ</heading>
<p><verb>
0x87 r/w DMA Channel 0
0x83 r/w DMA Channel 1
0x81 r/w DMA Channel 2
0x82 r/w DMA Channel 3
0x87 r/w Channel 0 Low byte (23-16) page Register
0x83 r/w Channel 1 Low byte (23-16) page Register
0x81 r/w Channel 2 Low byte (23-16) page Register
0x82 r/w Channel 3 Low byte (23-16) page Register
0x8b r/w DMA Channel 5
0x89 r/w DMA Channel 6
0x8a r/w DMA Channel 7
0x8f Refresh
0x8b r/w Channel 5 Low byte (23-16) page Register
0x89 r/w Channel 6 Low byte (23-16) page Register
0x8a r/w Channel 7 Low byte (23-16) page Register
0x8f r/w Low byte page 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>

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 -->
<!-- Original revision: 1.8 -->
<!-- Original revision: 1.9 -->
<!-- 日本語訳 鈴木康修 (yasu@hike.te.chiba-u.ac.jp) -->
<!--
<!DOCTYPE linuxdoc PUBLIC "-//FreeBSD//DTD linuxdoc//EN" [
@ -14,7 +14,7 @@
<p><em>原作: &a.uhclem;<newline>
<newline>訳: &a.yasu;<newline>
10 December 1996.</em>
10 December 1996. 最終更新日 8 October 1997.</em>
<!-- Version 1(3) -->
@ -59,24 +59,26 @@
なぜなら, CPUを使用してメモリ間のデータを動かす方が早いからです.
</quote>
PCアーキテクチャでは, それぞれのDMAチャネルは, 通常そのDMAを
使用するハードウェアがそのチャネルについてDRQを使って
転送を要求した時のみ動作します.
PCアーキテクチャでは, それぞれのDMAチャネルは, 通常
与えられたDMAチャネルを使用するハードウェアがそのチャネルについて
DRQ線を使って転送を要求した時のみ動作します.
<sect1><heading>DMA転送の例</heading>
<p>これはDMA転送の手順の例です.
<p>DMA転送の発生と処理の手順の例をあげてみましょう.
この例では, フロッピーディスクコントローラ (FDC)が
ディスケットから1バイト読み込んで, DMAを使って,メモリの0x00123456番地に
格納したいとします. 処理は, FDCによって, DRQ2信号を有効にして
DMAコントローラに要求を伝えることで開始します.
格納したいとします. 処理は, FDCが, DRQ2信号(DMAチャンネル2に
対するDRQ線)を有効にして
DMAコントローラに要求を伝えることで開始されます.
DMAコントローラはDRQ2シグナルが有効になったことを記録します.
するとDMAコントローラはDMAチャネル2がプログラムされ, 有効に
なっていることを確認します.
DMAコントローラはまた, 他のDMAチャネルがアクティブでないか, または
より高い優先度を持っていないかを確認します.
するとDMAコントローラはDMAチャネル2がプログラムされ, マスクが
かかっていない(有効になっている)ことを確認します.
同様に, DMAコントローラは, 他のDMAチャネルがアクティブまたは
アクティブになろうとしていないこと, そしてより高い優先度を持って
いないことを確認します.
一旦これらのチェックが完了すると, DMACはDMACがバスを使うために
バスを開放するようにCPUに要求します.
DMACはCPUにHRQ信号を送ってバスを要求します.
@ -115,7 +117,7 @@
FDCはバイトデータが転送されたことを認識します.
DMAサイクルは1度に1バイトしか転送しないので,
FDCはDRQ2信号を止めて, DMACに転送の終了を知らせます.
FDCはDRQ2信号を止めて, DMACに転送が終了したことを知らせます.
DMACは-DACK2信号を解除して, FDCはバス上へのデータ出力を
停止しなくてはならないことを知らせます.
@ -132,24 +134,29 @@
典型的なフロッピーディスクの1セクタについては, 上記のプロセスが
それぞれのバイトについて1回行われ, 全部で512回繰り返されます.
1バイト転送される毎に,DMAC内のアドレスレジスタはインクリメントされ,
何バイト転送すればよいかを示すカウンタがデクリメントされます.
同じくDMAC内にある, 何バイト転送すればよいかを示すカウンタが
デクリメントされます.
カウンタが0になると, DMAはカウンタが0になったことを示すEOP信号を
送り, DMAコントローラがCPUによって再びプログラムされるまで
これ以上データは転送されなくなります.
カウンタが0になると, DMAはEOP信号を送ります. この信号は
カウンタが0であり, DMAコントローラがCPUによって再び
プログラムされるまで, これ以上データは転送されないことを
示すものです.
このイベントはターミナルカウント(TC)とも呼ばれます.
EOP信号は1本しかありません. なぜならどんな時もただ1つのDMAチャネル
のみをアクティブにすることができるためです.
EOP信号は1本しかありません. そして, 一度にアクティブにできる
DMAチャネルは一本だけなので, 現在アクティブであるDMAチャネルこそが,
たった今処理を終了したDMAチャネルだと言うことができます.
もし, バッファの転送が完了した時に周辺機器から割り込みを発生させたい
とき, 周辺機器は -DACK信号およびEOP信号の両方が同時に発信されたか
どうかをテストします. それが生じると, DMACはCPUの介在がなければ
これ以上はその周辺機器についての情報を転送しないことを意味します.
すると周辺機器はプロセッサの注意を得るために割り込み信号のうちの1つを
発信します. DMAチップ自身は割り込みを生じさせる能力は持っていません.
とき, 周辺機器は -DACKn信号およびEOP信号の両方が同時に発信されたか
どうかをテストします. その場合, DMACはCPUの介在がなければ
これ以上はその周辺機器についての情報を転送しません.
その後で, 周辺機器はプロセッサに割り込みを生じさせるために,
何らかの割り込み信号を発生させることができます. PCアーキテクチャ
においては, DMAチップ自身が割り込みを生じさせることはできません.
周辺機器とそれに関連するハードウェアが割り込みを生成する責任を
持ちます.
持ちます. また, DMAを使用する周辺機器が割り込みを使用しない
可能性もあります.
DMACが要求を出したときにはCPUは常にバスをDMACに開放しますが,
この動作は, DMACがアクティブになった時にプロセッサが命令を実行するのに
@ -173,13 +180,13 @@
IBM PCが64k以上のメモリをサポートしていたため,
DMACが64kを越えるメモリ番地に読み込み又は書き込みを行うために
変更を行う必要が生じました.
この問題を解決するためにIBMが行ったのは, それぞれのDMAチャネルに
ついてラッチを追加することでした. つまり, 読み込む又は書き込む先
アドレスの上位ビットに保持するためのものです.
この問題を解決するためにIBMが行ったのは, それぞれのDMAチャネルに,
読み込み元または書き込み先のアドレスの上位ビットを保持するため
外部的なラッチを追加することでした.
DMAチャネルがアクティブな時はいつでも,
このラッチの内容はアドレスバスに書かれて, そのチャネルのDMA操作が
終了するまでそこに保持されます.
これらのラッチは「ページレジスタ」と呼ばれます.
IBMはこれらのラッチを「ページレジスタ」と呼んでいます.
そのため上記に示した例では, DMACはアドレスの0x3456の部分をバス上に
置き, DMAチャネル2に対するページレジスタは, 0x0012xxxxをバス上に
@ -188,25 +195,27 @@
ページレジスタのラッチはDMAチップとは独立であるので,
読み込まれる又は書き込まれるメモリ領域は, 64kの物理的境界を
またいではなりません.
DMACがメモリの0xffff番地をアクセスすると, データの転送後,
またいではなりません. 例えば, もし
DMACがメモリの0xffff番地をアクセスした場合, データの転送後,
DMACはアドレスレジスタをインクリメントし, 0x0000番地にある次のバイトを
アクセスします. 0x10000番地ではありません.
これはおそらく意図されたものとは異なっているでしょう.
<quote><em>注:</em> 「物理的な」 64Kの境界を 8086モードの
64k「セグメント」と混同してはいけません. セグメントは, セグメント
レジスタにオフセットレジスタを加算して作られるものです.
ページレジスタにはアドレスのオーバーラップはありません. </quote>
レジスタに数学的にオフセットレジスタを加算して作られるものです.
ページレジスタにはアドレスのオーバーラップも無く,数学的に
ORを取られることもありません. </quote>
さらに複雑なことには, PC/ATでは外部のDMAアドレスのラッチは
8ビットしか保持しません. よって8+16で24ビットになり, これは
DMAが0から16メガの間のメモリ番地しか指し示せないことを
意味します. 16メガ以上のメモリを持ったより新しいマシンにおいても,
PCコンパチブルなDMAでは16メガ以上のメモリ番地にはアクセスできません.
標準的なPCコンパチブルなDMAでは16メガ以上のメモリ番地には
アクセスできません.
この制限を避けるために, オペレーティングシステムは
16メガ以下にある物理的な64kの境界をまたがない領域にバッファを
16メガ以下にある物理的な64kの境界をまたがない領域にRAMバッファを
予約します. そして, DMACはデータを周辺機器からそのバッファに
転送するようにプログラムされます. 一旦DMACがこのバッファに
データを動かすと, オペレーティングシステムは本当にデータを
@ -219,6 +228,10 @@
「バウンスバッファ」と呼ばれます. MS-DOSの世界では,
これらは「スマートバッファ」などと呼ばれます.
<quote><em>注意:</em> 82374と呼ばれる8237の新しい実装においては,
ページレジスタを16ビットで指定して, バウンスバッファを使用しなくても,
32ビットのアドレス空間全体にアクセスすることが可能です.
<sect1><heading>DMA操作モードとその設定</heading>
@ -235,8 +248,8 @@
よって使用されます.
周辺装置は次の転送の準備ができる毎にDMAを要求します.
フロッピーディスクコントローラは1バイトのバッファしか持たないので,
このモードを使用します.
標準的なPCコンパチブルなフロッピーディスクコントローラ(NEC 765)は
1バイトのバッファしか持たないので, このモードを使用します.
<tag>ブロック/デマンド転送モード</tag>
@ -249,10 +262,10 @@
ブロック転送モードとデマンド転送モードの違いは, 一旦ブロック転送が
始まると,転送カウンタか0になるまでそれが行われるところです.
1バイト転送するにはDRQが -DACK が有効になるまでの間だけ
有効であれば充分です.
デマンドモードはDRQが有効な間は転送が続けられます.
DMACが転送を一時中止した場合はバスを解放してCPUに返します.
DRQは-DACKが有効になるまでの間は有効でなければなりません.
デマンドモードはDRQが有効な間転送が続けられます.
DRQが有効でなくなった場合, DMAはその時点で転送を中断し,
バスを解放してCPUに返します.
その後、DRQが有効になると, 転送は中断したところから再開されます.
データの転送, 特に転送に使われるメモリ番地が16Mを越える場合に,
@ -264,35 +277,38 @@
このメカニズムはDMAチャネルがバスを要求することを許可する
ものですが, 接続されたデバイスはバス上のアドレス情報の配置に
ついてDMACに代わって責任を持ちます.
これはいわゆる「バスマスタ」というものです.
これは「バスマスタ」と呼ばれる技術の実装に利用されます.
カスケードモードのDMAチャネルがバスのコントロールを受け取ると,
DMAは通常行われるようなバス上のアドレスとI/Oコントロール信号の
出力を行いません. 代わりに, DMAはこのチャネルの -DACK信号を
出力を行いません. 代わりに, DMAはアクティブなチャネルの -DACK信号を
有効にします.
この時点で, アドレスとバスコントロール信号の供給は
DMAチャネルに接続されたデバイスが担当します.
DMAチャネルに接続された周辺機器が担当します.
周辺機器はシステムバスの完全なコントロールを行い,
16メガ以下の任意のアドレスの読み込みおよび書き込みを行うことが
できます. 周辺機器はバスの使用を終えると, DRQ線を無効にして,
DMAコントローラはCPUもしくは他のDMAチャネルに制御を返します.
できます. 周辺機器はバスの使用を終えるとDRQ線を無効にするので,
DMAコントローラはCPUもしくは他のDMAチャネルに制御を返すことが
できます.
カスケードモードは複数のDMAコントローラを相互接続するのに
使われます. PC内ではDMAチャネル4がまさにこの用途に使われています.
周辺機器がDMAチャネル0, 1, 2, 3でバスを要求すると,
スレーブDMAコントローラは HLDREQ を有効にしますが,
この線は実際にはプライマリDMAコントローラのDRQ4に接続されています.
プライマリのDMAコントローラはその後 HLDREQ を使ってCPUにバスを
要求します. バスが与えられると, -DACK4が有効になり,
この線はCPUではなく, 実際にはプライマリDMAコントローラのDRQ4に
接続されています.
その後, チャンネル4になにか仕事があるものと見なしたプライマリの
DMAコントローラは HLDREQ を使ってCPUにバスを
要求します. バスが与えられると, -DACK4が有効になりますが,
この線は実際にはスレーブDMAコントローラの HLDA信号に
接続されています.
スレーブDMAコントローラはその後要求したDMAチャネルに対して
データを転送するか, SCSIコントローラのような
スレーブDMAコントローラはその後要求したDMAチャネル
(0, 1, 2, 3) に対してデータを転送するか, SCSIコントローラのような
バスマスタリングを要求する周辺機器にバスを許可します.
このような配線がおこなわれているため, PC/ATシステムでは
DMAチャネルは
このような配線がおこなわれているため, PC/ATシステム
周辺機器ではDMAチャネルは
0, 1, 2, 3, 5, 6, 7のみが使用できます.
<quote><em>注:</em>
@ -355,9 +371,10 @@
<p>プログラムされるDMAチャネルは, 通常, 設定を行う前に
「マスクする」べきです.
これはハードウェアが予期せずDRQを有効にすると, たとえ全てのパラメータが
これはハードウェアが予期せずそのチャンネルに対してDRQを有効に
した場合, たとえ全てのパラメータが
満たされてない場合や更新されていない場合でも, DMACは
それに応答してしまうからです.
それに応答してしまう可能性があるからです.
マスクを行ってから,ホストは転送の方向(メモリからI/O,
もしくはI/Oからメモリ)と, 転送に使用するDMA操作のモード
@ -373,14 +390,14 @@
I/Oポートの別のセットを通してアクセスされます.
すべての設定ができると, DMAチャネルはマスクを解除することができます.
そのDMAチャネルは「準備ができた」とみなされ, DRQが有効になると
応答します.
そのDMAチャネルは「準備ができた」とみなされ, そのチャンネルのDRQが
有効になると応答します.
8237のプログラミングの正確な詳細については,
ハードウェアデータブックを参照してください.
PCシステムにおけるI/Oマップについても参照する必要があるでしょう.
このマップにはDMAおよびページレジスタのポートがどこに位置するのかを
書いてあります. 以下に完全なを示します.
書いてあります. 以下に完全なポートのマップテーブルを示します.
<sect1><heading>DMAポートのマップ</heading>
@ -397,44 +414,44 @@
<verb>
0x00 write Channel 0 starting address
0x00 read Channel 0 current address
0x02 write Channel 0 starting word count
0x02 read Channel 0 remaining word count
0x01 write Channel 0 starting word count
0x01 read Channel 0 remaining word count
0x04 write Channel 1 starting address
0x04 read Channel 1 current address
0x06 write Channel 1 starting word count
0x06 read Channel 1 remaining word count
0x02 write Channel 1 starting address
0x02 read Channel 1 current address
0x03 write Channel 1 starting word count
0x03 read Channel 1 remaining word count
0x08 write Channel 2 starting address
0x08 read Channel 2 current address
0x0a write Channel 2 starting word count
0x0a read Channel 2 remaining word count
0x04 write Channel 2 starting address
0x04 read Channel 2 current address
0x05 write Channel 2 starting word count
0x05 read Channel 2 remaining word count
0x0c write Channel 3 starting address
0x0c read Channel 3 current address
0x0e write Channel 3 starting word count
0x0e read Channel 3 remaining word count
0x06 write Channel 3 starting address
0x06 read Channel 3 current address
0x07 write Channel 3 starting word count
0x07 read Channel 3 remaining word count
</verb>
DMA コマンドレジスタ
<verb>
0x10 write Command Register
0x10 read Status Register
0x12 write Request Register
0x12 read -
0x14 write Single Mask Register Bit
0x14 read -
0x16 write Mode Register
0x16 read -
0x18 write Clear LSB/MSB Flip-Flop
0x18 read -
0x1a write Master Clear/Reset
0x1a read Temporary Register
0x1c write Clear Mask Register
0x1c read -
0x1e write Write All Mask Register Bits
0x1e read -
0x08 write Command Register
0x08 read Status Register
0x09 write Request Register
0x09 read -
0x0a write Single Mask Register Bit
0x0a read -
0x0b write Mode Register
0x0b read -
0x0c write Clear LSB/MSB Flip-Flop
0x0c read -
0x0d write Master Clear/Reset
0x0d read Temporary Register (新しいバージョンでは利用不可)
0x0e write Clear Mask Register
0x0e read -
0x0f write Write All Mask Register Bits
0x0f read Read All Mask Register Bits (Intel 82374にのみ存在する)
</verb>
<sect2><heading>0xc0 - 0xdf DMA コントローラ &num;2 (Channels 4, 5, 6 and 7)</heading>
@ -477,25 +494,115 @@ DMA
0xd8 write Clear LSB/MSB Flip-Flop
0xd8 read -
0xda write Master Clear/Reset
0xda read Temporary Register
0xda read Temporary Register (Intel 82374には存在しない)
0xdc write Clear Mask Register
0xdc read -
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>
<sect2><heading>0x80 - 0x9f DMA ページレジスタ</heading>
<p><verb>
0x87 r/w DMA Channel 0
0x83 r/w DMA Channel 1
0x81 r/w DMA Channel 2
0x82 r/w DMA Channel 3
0x87 r/w Channel 0 Low byte (23-16) page Register
0x83 r/w Channel 1 Low byte (23-16) page Register
0x81 r/w Channel 2 Low byte (23-16) page Register
0x82 r/w Channel 3 Low byte (23-16) page Register
0x8b r/w DMA Channel 5
0x89 r/w DMA Channel 6
0x8a r/w DMA Channel 7
0x8f Refresh
0x8b r/w Channel 5 Low byte (23-16) page Register
0x89 r/w Channel 6 Low byte (23-16) page Register
0x8a r/w Channel 7 Low byte (23-16) page Register
0x8f r/w Low byte page 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>