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

23.3.2. DMA ページレジスタ および 16メガ アドレス空間制限

これまで述べたのとは異なり, DMACはアドレス線を 0x0123456 にセットする 代わりに 0x3456 だけをセットすることにあなたは気づいたかも しれません. この理由について少し説明します.

オリジナルのIBM PCがデザインされた時, IBMは, DMACと割込み制御チップの 両方を, 8085(8ビットプロセッサで, 16ビットのアドレス空間(64k)を持つ)と 組み合わせて使うように設計されたチップを使うことを選びました. IBM PCが64k以上のメモリをサポートしていたため, DMACが64kを越えるメモリ番地に読み込み又は書き込みを行うために 変更を行う必要が生じました. この問題を解決するためにIBMが行ったのは, それぞれのDMAチャネルに, 読み込み元または書き込み先のアドレスの上位ビットを保持するための 外部的なラッチを追加することでした. DMAチャネルがアクティブな時はいつでも, このラッチの内容はアドレスバスに書かれて, そのチャネルのDMA操作が 終了するまでそこに保持されます. IBMはこれらのラッチを「ページレジスタ」と呼んでいます.

そのため上記に示した例では, DMACはアドレスの0x3456の部分をバス上に 置き, DMAチャネル2に対するページレジスタは, 0x0012xxxxをバス上に 置きます. これらの2つの値が組み合わされてアクセスされるメモリ中の完全な アドレスを形成します.

ページレジスタのラッチはDMAチップとは独立であるので, 読み込まれる又は書き込まれるメモリ領域は, 64kの物理的境界を またいではなりません. 例えば, もし DMACがメモリの0xffff番地をアクセスした場合, データの転送後, DMACはアドレスレジスタをインクリメントし, 0x0000番地にある次のバイトを アクセスします. 0x10000番地ではありません. これはおそらく意図されたものとは異なっているでしょう.

注: 「物理的な」 64Kの境界を 8086モードの 64k「セグメント」と混同してはいけません. セグメントは, セグメント レジスタに数学的にオフセットレジスタを加算して作られるものです. ページレジスタにはアドレスのオーバーラップも無く,数学的に ORを取られることもありません.

さらに複雑なことには, PC/ATでは外部のDMAアドレスのラッチは 8ビットしか保持しません. よって8+16で24ビットになり, これは DMAが0から16メガの間のメモリ番地しか指し示せないことを 意味します. 16メガ以上のメモリを持ったより新しいマシンにおいても, 標準的なPCコンパチブルなDMAでは16メガ以上のメモリ番地には アクセスできません.

この制限を避けるために, オペレーティングシステムは 16メガ以下にある物理的な64kの境界をまたがない領域にRAMバッファを 予約します. そして, DMACはデータを周辺機器からそのバッファに 転送するようにプログラムされます. 一旦DMACがこのバッファに データを動かすと, オペレーティングシステムは本当にデータを 格納したいアドレスにバッファからデータをコピーします.

16メガを越えるアドレスからDMAベースの周辺機器にデータを 書き込む際には, データは16メガ以下に位置したバッファから最初に コピーされなくてはならず, その後, DMACはバッファからハードウェアに データをコピーすることができます. FreeBSDでは, これらの予約バッファは 「バウンスバッファ」と呼ばれます. MS-DOSの世界では, これらは「スマートバッファ」などと呼ばれます.

注意: 82374と呼ばれる8237の新しい実装においては, ページレジスタを16ビットで指定して, バウンスバッファを使用しなくても, 32ビットのアドレス空間全体にアクセスすることが可能です.


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