タグ付けされた質問 「linux-kernel」

このタグは、Linuxカーネル自体の内部について、特にカーネルのコンテキスト内で実行されるコード(カーネルモジュールやドライバーなど)についての質問に使用します。Linuxでのユーザー空間コードの記述に関する質問は通常、代わりに[linux]とタグ付けする必要があります。Linuxカーネルの内部は常に変化しているため、関心のある正確なカーネルバージョンを含めると役立ちます。

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, …

1
同じ名前の関数にマクロを定義するのはなぜですか?
私はhttps://github.com/torvalds/linux/blob/master/arch/x86/include/asm/atomic.hで以下のコードを見つけました static __always_inline bool arch_atomic_sub_and_test(int i, atomic_t *v) { return GEN_BINARY_RMWcc(LOCK_PREFIX "subl", v->counter, e, "er", i); } #define arch_atomic_sub_and_test arch_atomic_sub_and_test #define本当に何をしますか?いつそうする必要がありますか?
12 c  linux-kernel 
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.