Skip to content
oraccha edited this page Jan 14, 2013 · 1 revision

Direct Memory Access

バスマスタの(単純な)一つの形態であり,CPU を介さずにデバイスから直接メモリに読書きする方式.

  • DMA の利点の一つは CPU がソフトウェア的に実行するよりも高速なデータ転送であったが,CPU の高速化にともないそのメリットはあまりなくなった.それよりもデバイスからメモリにデータ転送をやっている間,CPU がそれとは平行に別の仕事を実行することができることの方がシステムパフォーマンス向上に貢献している.DMA 中はデバイスがバスマスタになるため,CPU がメインメモリにアクセスすることはできないが,CPU はキャッシュを持っているので,問題は少ない.
    • バスマスタデバイスが DMA 転送を行った際,キャッシュとメインメモリの整合性が問題になる.
    • ISA の場合,キャッシュの整合性はハードウェアで処理されるらしい.これはキャッシュを持たない素の 386 との互換性のため.
  • データバスに対してはどのデバイスもデータを発行することができるが,バスマスタデバイスだけがアドレスバスに制御信号を発行することができる.

386 ではバスマスタデバイスは物理アドレスを使用してメインメモリにアクセスする.つまり,デバイスのバス幅の関係で,ISA は 16MB(24bit),32bit PCI は 4GB 以上のアドレス空間に DMA を割り当てることができない.そこで,OS 側でバウンスバッファ(低位アドレスに存在するバッファ)へのコピーを介して,DMA 空間にアクセスすることになる.


バスマスタデバイスによるメインメモリのアクセス

  1. 386 の場合 {{{ CPU ↓ 仮想アドレス MMU ↓ 物理アドレス メインメモリ ↑ 物理アドレス バスマスタデバイス }}}

  2. バスコントローラが MMU を持つ場合 {{{ CPU ↓ 仮想アドレス(CPU) MMU ↓ 物理アドレス メインメモリ ↑ 物理アドレス MMU ↑ 仮想アドレス(デバイス) バスマスタデバイス }}}

日立の 2050 がそうだったらしい.SPARC も?

  • DVMA(Direct Virtual Memory Access) というらしい.

関連する話題

Clone this wiki locally