ハードディスクのデータは DMA を使用してメイン メモリに転送されますが、ネットワーク スタックのデータは DMA を使用できず、データはプロセッサを経由する必要があることを知りました。本当ですか?はいの場合、これを回避する方法は何ですか? プロセッサを介してデータを転送するのは本当に効率が悪いのではないですか?
2 に答える
本当ですか?
いいえ!この目的のために特別に割り当てられたメモリ バッファへのネットワーク デバイス DMA。ネットワーク IO の DMA は、1990 年代初頭に PCI バスが登場して以来、x86 の世界では一般的なルールとなっています。
プロセッサを介してデータを転送するのは本当に効率が悪いのではないですか?
はい、信じられないほど非効率的です。初期化後、コアが最新のネットワーク カードと直接やり取りするのは、「ドアベルの送信」の信号を送るときだけです。このドアベルは、新しいパケットを送信するためにメモリを調べるようにカードに指示する単独の書き込み操作です。コアとネットワーク デバイス間の他のすべての対話は、メモリを介して間接的に行われます。
最近のほとんどのネットワーク カード、またはその他のハードウェアもデータ転送に DMA を使用しますが、ユーザー アプリケーションからのデータのほとんどを CPU がネットワーク カードが期待するデータに変換する必要があるという事実から混乱が生じます (たとえば、TCP パケットの形式やイーサネット フレームなど)。CPU はデータの送信に使用されるさまざまなネットワーク プロトコルを実装しているため、この処理は CPU によって実行される必要があります。
ちなみに、ハードドライブについても同じことが言えます。RAM からハード ディスクに大きなデータ ブロックを転送するために DMA が使用されますが、ほとんどの場合、CPU はこれらのデータ ブロックが正しい場所に配置され、正しいファイル システム タイプにフォーマットされることを確認する必要があります。