DMAとメモリマップドIOの違いは何ですか?どちらも私に似ています。
メモリマップドI/Oにより、CPUは特定のメモリアドレスを読み書きすることでハードウェアを制御できます。通常、これは制御ビットの変更などの低帯域幅操作に使用されます。
DMAを使用すると、ハードウェアはCPUを使用せずにメモリを直接読み書きできます。通常、これはディスクI/Oやカメラビデオ入力などの高帯域幅操作に使用されます。
他の人がすでに質問に答えているので、少しだけ歴史を追加します。
昔、x86(PC)ハードウェアには、I/Oスペースとメモリスペースしかありませんでした。これらは2つの異なるアドレス空間であり、異なるバスプロトコルと異なるCPU命令でアクセスされましたが、同じプラグインカードスロットを介して通信できました。
ほとんどのデバイスは、制御インターフェイスとバルクデータ転送インターフェイスの両方にI/Oスペースを使用していました。データにアクセスする簡単な方法は、多くのCPU命令を実行して、I/Oアドレスからメモリアドレスに一度に1ワードずつデータを転送することでした(「ビットバンギング」とも呼ばれます)。
デバイスからホストメモリにデータを自律的に移動するために、デバイスが転送を開始するためのISAバスプロトコルはサポートされていませんでした。妥協案が発明されました:DMAコントローラー。これは、CPUのそばに立ち、データをデバイスのI/Oアドレスからメモリに、またはその逆に移動するための転送を開始するハードウェアの一部でした。 I/Oアドレスが同じであるため、DMAコントローラーはCPUとまったく同じ操作を実行しますが、もう少し効率的で、バックグラウンドで実行し続けるためのある程度の自由を可能にします(ただし、メモリと通信できない限り)。
PCIの時代に早送りすると、バスプロトコルが大幅にスマートになり、どのデバイスでも転送を開始できます。したがって、たとえば、RAIDコントローラカードは、好きなときにいつでもホストとの間で好きなデータを移動することができます。これは「バスマスター」モードと呼ばれますが、特に理由はありませんが、古いDMAコントローラーがなくなったとしても、人々はこのモードを「DMA」と呼び続けます。古いDMA転送とは異なり、対応するI/Oアドレスがまったくないことが多く、バスマスターモードがデバイスに存在する唯一のインターフェイスであり、CPUの「ビットバンギング」モードがまったくありません。
メモリマップドIOは、デバイスレジスタがマシンのメモリ空間にマップされることを意味します-これらのメモリ領域がCPUによって読み書きされるとき、実際のデバイスではなく、デバイスからの読み取りまたはデバイスへの書き込みです。メモリ。デバイスから実際のメモリバッファにデータを転送するには、CPUはメモリマップされたデバイスレジスタからデータを読み取り、バッファに書き込む必要があります(逆にデータをデバイスに転送する場合)。
DMA転送を使用すると、デバイスは実際のメモリバッファ自体との間でデータを直接転送できます。CPUはデバイスにバッファの場所を通知し、その後、他の作業を実行できます。デバイスはメモリに直接アクセスしています。
ダイレクトメモリアクセス(DMA)は、CPUの介入なしに、データをI/Oからメモリに、およびメモリからI/Oに転送する手法です。この目的のために、DMAコントローラーという名前の特別なチップを使用して、すべてのアクティビティとデータの同期を制御します。その結果、他のデータ転送技術と比較して、DMAははるかに高速です。
一方、仮想メモリはメインメモリとセカンダリメモリ間のキャッシュとして機能します。データは事前にセカンダリメモリ(ハードディスク)からメインメモリにフェッチされるため、必要なときにデータはメインメモリですでに使用可能です。これにより、サポートするのに十分な物理メモリよりも多くのアプリケーションをシステムで実行できます。