Direct_Memory_Access
[Wikipedia|▼Menu]

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が実装されている。


次ページ
記事の検索
おまかせリスト
▼オプションを表示
ブックマーク登録
mixiチェック!
Twitterに投稿
オプション/リンク一覧
話題のニュース
列車運行情報
暇つぶしWikipedia

Size:29 KB
出典: フリー百科事典『ウィキペディア(Wikipedia)
担当:undef