現在調査中です。TCP_ZEROCOPY_RECEIVENICのヘッダデータ分割サポートが必要であることを読みました。私が理解したのは、この機能はDMAヘッダー(IP、TCPヘッダー)とデータ(残り)を別々のバッファーに入れることです。 (キャッシュ効率を向上させるために)TCP_ZEROCOPY_RECEIVEの場合、プロセスの仮想アドレスにマッピングするためにデータをページ整列する必要があることがわかります。私の質問は、データをページに並べ替えるためにNICのヘッダデータ分割をサポートする必要がある理由です。ネットワークデバイスドライバがsk_buff構造体を生成するときにヘッダーのみを読み取って別々に割り当てられたページにデータをコピーしてZero Copyを行うことはできませんか?また、ネットワークカードドライバがネットワークカードと対話してヘッダデータ分割機能を利用する方法を知りたいと思います。
私が理解した内容が間違っていると申し訳ありません。追加する必要がある場合はお知らせください。ありがとうございます。
答え1
私の質問は、データをページに並べ替えるためにNICのヘッダデータ分割をサポートする必要がある理由です。ネットワークデバイスドライバがsk_buff構造体を生成するときにヘッダーのみを読み取って別々に割り当てられたページにデータをコピーしてZero Copyを行うことはできませんか?
コンテキストでは、権限のないユーザースペースのみがデータに直接アクセスできるため、ヘッダーをデータから分離する必要があります。
ゼロコピーTCP受信の目的は、受信時にユーザースペースに正確にゼロのデータコピーを含めることです。状況が保証されると、NICはパケットをユーザー空間メモリ領域にDMAする必要があります。受信プロセスによって設定されます。ドライバが分割するためにデータをコピーする必要がある場合、それはゼロコピーではありません。
バラよりこれ カップルこのトピックの詳細については、この記事の著者: Jakub Kicinski。