Direct Memory Access

出典: フリー百科事典『ウィキペディア(Wikipedia)』

Direct Memory Access(DMA)は、CPUを介さず、バスを使いメモリとメモリ、またはメモリとI/O(周辺デバイス等)の間で直接的にデータ転送を行う機能。[1]

コンピュータにDMAが無い場合はデータ転送はCPUが行うが、DMAを使用している場合、CPUに代わりDMAがデータを転送する[1]。DMAを制御する装置をDMAコントローラ(DMA Controller, DMAC)という。

概要[編集]

DMAを使うと高速のデータ転送が可能になり、コンピュータの性能を総合的に上げることができる[1]。 DMAがあれば、CPUは、データ転送の仕事はDMACにまかせて、その時間をCPUにしかできない仕事に使うことができる[1][2][注釈 1]

ただし、DMAは1本しかないバスをCPUと分け合って使うため、バスの使用権の調整が必要となる[1]。 このバスの使用権の調整は英語で「バスアービトレーション(Bus Arbitration)」といい、「バス権の調停」と訳されている[1]。→#バスアービトレーション

DMAでのデータ転送は、通常は、DMACが行う。CPUはDMACに、データの転送元・転送先や転送モードやデータ数などを指定し、その後に転送開始のトリガーを送るだけである[3][1]。トリガーを送れば、CPUは他のタスクを開始することができる[3]。DMACの側は、データ転送の仕事を完了したら、CPUに割り込みをかけて転送終了を知らせる[1]。またデータ転送でエラーが生じた場合も、CPUに割り込みをかけて知らせる[3]

AMD DirectGMA はDMAの一形態である。

なお、昔のISAバス方式では、CPUはマザーボードチップセットに内蔵されたDMAコントローラに命令を送る方式であった。現代のPCIバスでは、「Bus mastering DMA」すなわちI/O機器の側がPCIバスの制御を任されDMA転送をすべて司る方式が採用されている。一方、組込システムでは、CPU内でバスに直結されたDMAエンジンがチップ内のバスを操作してDMAを実現するものがある。

ネットワークのパケット送信や音楽再生やビデオ配信などの際には継続的な読み出しを必要とし、DMAは専用の組み込みチップで使われている。またDMAは、マルチコアでもクラスタリングでも効果を発揮する。この場合、DMA通信の状態通知ピンとして、受信状態を示すHOLDピンと、送信状態を示すHLDAピンが存在する。

バスアービトレーション[編集]

DMAのバスアービトレーションの方式の代表的なものとしては、ラウンドロビンサイクルスチールバーストがある。ラウンドロビンはバス権を順番に譲っていく方式。サイクルスチール方式では、CPUがメモリにアクセスしていないバスサイクルの間にDMAがバスを使う。バースト方式は、一定時間、1つのバスマスターがバス権を占有する方式で、優先度の高いデータを急いで転送したい時に使う。[4]

サイクルスチールモードDMA
CPUからメモリBUS制御を渡してもらい、1~2ワードずつ転送する方法[5]。CPUは隙間なくメモリBUSを利用するとは限らないので、CPUが処理を進めるのと並行したデータ転送が可能となり得る。
バーストモードDMA(ブロック転送と呼ぶ資料[5]もある)
CPUからメモリBUS制御を渡してもらい、データを一気に転送する方法[5]

使用上の注意[編集]

DMAの使用上の注意点として挙げられる主なもののひとつはオーバーランで、もう1つはキャッシュと併用するシステムのメモリの一貫性である。

オーバーラン

オーバーランとは通信機能を使用する時など、受信バッファに取り込まれたデータをCPUやDMAが読み出さないうちに次のデータを取り込んでしまい、1つ前の受信データが失われてしまうこと。特にサイクルスチールやバースト方式では、CPUやDMAがバス使用権を待つ時間が長くなり、待つ間に通信機能が次のデータを受け取ってしまうとオーバーランが発生する。ラウンドロビン方式だと、バス使用権の待ち時間が短く、オーバーランは発生しにくい。[6]

データの一貫性問題

キャッシュを使ったシステムでは、キャッシュが持っているデータと同じアドレスのメインメモリをDMAが書き換えてしまうと、キャッシュとメインメモリのデータの一貫性が失われてしまうので、一貫性を管理する何らかの方法が必要となる[6]

仮想記憶でのページ境界

また、仮想記憶アドレス上で DMA を利用する場合、ページ境界をまたぐことがないようにする必要がある。境界をまたいだ場合、後続の論理アドレスページに対応する物理アドレスページが同様に連続した後続領域に確保されるとは限らないからである[7]

歴史[編集]

DMAはPDPシリーズにおいて採用されていた。

1970年代にリリースされた数MHzで動作するマイクロプロセッサでは、CPUによるデータ転送ハードディスク等の10MB/秒程度の転送速度を発揮する事は困難で、専用のコントローラでデータ転送を行う必要があった。このコントローラは、データ転送を高速に行う機能に特化したCPUであったともいえる。たとえばZ80にはZ80DMA、MC68000には、MC68450などのDMAコントローラ(DMAC)が用意されていた。

また、日立のH8にもDMACが存在している[8]

Intel 80286(APX286。1982年2月発表)などでは、当時通常のI/Oを制御するためには充分な動作速度だったことや、主流のパーソナルコンピュータにおいてi8249等の低速なDMACしか搭載されておらず、他に適当なDMACが存在しなかったことなどから、DMAはあまり使用されなくなった。

1990年代に、CPUの世代がPentiumになり充分に高速になると、今度は、低速なI/Oの管理がボトルネックとなったため、いわゆるチップセットにI/O専用の高速なDMACが搭載されたり、周辺機器制御LSIが簡単なDMA機能を持つようになり、再度DMAが活用されるようになった。Pentium以降主流となったPCIバスでは、バスマスタリングとしてDMAが実装されている。

高機能DMACの登場

初期のDMACは単純に指定されたアドレス範囲を指定されたメモリもしくはポートに入出力する機能のみを備えていた。しかしオペレーティングシステムが普及し、ハードディスクへのI/OにDMACを使う様になってから、DMACには「データブロックを分割する(スキャッタリング)」「データブロックを集約する(ギャザリング)」を行う機能が要求された。MC63450 DMAC等には、DMACがリンクリストを読み取って転送内容を分割したり集約する機能が搭載されている。PC/AT互換機向けのSCSIホストアダプタカード等では、コントローラチップに集積されているDMACがこの機能を担当していた。スキャッタリング・ギャザリング機能が無い場合CPUは最低でも1セクタ分ずつメモリ・メモリ間転送を行わなければならず、またDMACに読み取らせるメモリ領域が転送完了するまで使用できないため、I/O時のCPU負荷上昇とI/O待ち時間が発生しシステム性能に悪影響を与えた。

DMAC、DMA機能を持つLSI[編集]

代表的なものを挙げる。

  • Z80DMA
  • μPD8237AC-5(i8237A英語版-5互換)[9]
  • MC68450
  • i430など、PentiumCPU以降対応のチップセット
  • μPD71037[10]
  • μPD71071[11]

脚注[編集]

  1. ^ a b c d e f g h [https://edn.itmedia.co.jp/edn/articles/1608/18/news015.html EDN, 菅井賢「DMAのメリットって何?」
  2. ^ Tech Target, Direct Memory Access
  3. ^ a b c Linda Null, ‎Julia Lobur(2006), The Essentials of Computer Organization and Architecture, p.335, Direct Memory Access
  4. ^ [https://edn.itmedia.co.jp/edn/articles/1608/18/news015_2.html 「DMAって何 p.2」
  5. ^ a b c Hayes, John P. (1978,1979). Computer Architecture and Organization. McGRAW-HILL INTERNATIONAL BOOK COMPANY. pp. 426-427. ISBN 0-07-027363-4 
  6. ^ a b https://edn.itmedia.co.jp/edn/articles/1608/18/news015_3.html
  7. ^ Hennessy, John L.; Patterson, David A. (1994). Computer Organization and Design: The Hardware/Software Interface. Morgan Kaufmann Publishers. p. 574. ISBN 1-55860-281-X 
  8. ^ CQ「H8-MPUを知る」
  9. ^ 川村 清『PC-9801解析マニュアル[第0巻]』秀和システムトレーディング株式会社、1983年6月30日、199-236頁。 
  10. ^ pPD71037 Direct Memory Access (DMA) Controller”. 2024年1月7日閲覧。
  11. ^ µPD71071 DMA Controller”. p. 940(5g1). 2024年4月26日閲覧。
  1. ^ 外部入出力(I/O)や周辺装置のデータ転送速度は通常、RAMよりも桁違いに遅いので、DMAが使われる以前は、CPUはデータ転送の仕事の間、ほとんどの時間待っていなければならず、その間は他の仕事ができなかった。

関連項目[編集]

外部リンク[編集]