タグ付けされた質問 「splice」

2
dma_mmap_coherent()マップメモリ​​のゼロコピーユーザー空間TCP送信
Linux 5.1をCyclone V SoCで実行しています。これは、1つのチップに2つのARMv7コアを備えたFPGAです。私の目標は、外部インターフェースから大量のデータを収集し、このデータ(の一部)をTCPソケット経由でストリーミングすることです。ここでの課題は、データレートが非常に高く、GbEインターフェイスが飽和状態になる可能性があることです。私はwrite()ソケットへの呼び出しを使用するだけの実用的な実装を持っていますが、55MB /秒で最高です。理論上のGbE制限の約半分。現在、ゼロコピーTCP送信を機能させてスループットを向上させようとしていますが、壁にぶつかっています。 FPGAからLinuxユーザー空間にデータを取り込むために、カーネルドライバーを作成しました。このドライバーは、FPGAのDMAブロックを使用して、外部インターフェイスからARMv7コアに接続されたDDR3メモリに大量のデータをコピーします。ドライバは、使用してプローブするときの連続1MBのバッファの束としてこのメモリを割り当てdma_alloc_coherent()てGFP_USER、そして実装することで、ユーザ空間アプリケーションにこれらを公開mmap()中のファイルに/dev/して使用してアプリケーションにアドレスを返すdma_mmap_coherent()事前に割り当てられたバッファに。 ここまでは順調ですね; ユーザー空間アプリケーションは有効なデータを表示しており、スループットは360MB /秒以上で十分であり、余裕があります(外部インターフェイスは、上限が実際にわかるほど高速ではありません)。 ゼロコピーTCPネットワークを実装するために、私の最初のアプローチはSO_ZEROCOPYソケットで使用することでした: sent_bytes = send(fd, buf, len, MSG_ZEROCOPY); if (sent_bytes < 0) { perror("send"); return -1; } ただし、これによりが発生しsend: Bad addressます。 少しグーグルで調べた後、私の2番目のアプローチはパイプを使用し、splice()その後にvmsplice(): ssize_t sent_bytes; int pipes[2]; struct iovec iov = { .iov_base = buf, .iov_len = len }; pipe(pipes); sent_bytes = vmsplice(pipes[1], &iov, …
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.