2

大きなフレーム(ジャンボ)を送信するために複数のフレームのdmaを実行したい。通常の額縁(サイズ1500)でお送りできます。dmaについて少し疑問があります。

  1. 他の API に対する dma_map_single() の本当の利点は何ですか。dma_map_page ですべてを行うことができますよね?

  2. driver で大きなフレーム (ジャンボ) を送信する必要があり、このフレームを複数のバッファーに格納したとします。これらのバッファーは、物理メモリまたは仮想メモリ内で連続していません。ただし、これらのバッファーはカーネル空間にあります。どうすればそれを 1 フレームとして送信できますか。scatter-gather dma を使用する必要がありますか? これは他の dma_api で可能ですか?

4

1 に答える 1

0
  1. dma_map_single と dma_map_page は最終的に dam_ops->map_page を呼び出します - 最終的な機能はアーキテクチャとカーネル構成によって決定されます。通常、IOMMU を搭載した x86 マシンでは intel_map_page になります。
  2. まず第一に、カーネルの観点からのジャンボ フレームは、ネットワーク スタックが送信されたバッファーを最大 64K パケット (LSO/TSO) に結合し、NIC が最終的に単一の 64K パケットを複数の MTU (ETH で 9K/1500) に分割するため、TX 時間には無関係です。 ) 独自の L3 ヘッダーを持つサイズのパケット。

あなたの質問に対して、SKB はスキャッター ギャザー リストを持つことができます。各バッファーは dma マップされます。dma-addresses とバッファ長のリストは、NIC への送信記述子に書き込まれます。NIC は、それらをすべて組み合わせて送信する方法を知っています。

ちなみに、カーネルには分散リスト用の dma_map_sg API があり、dma アドレスのリストを含む分散リストを返します。これは通常、NIC ドライバーには関係ありません。

于 2014-03-08T20:12:16.797 に答える