カーネルとユーザー空間プログラム間の次のインターフェースを介して情報交換が行われることを知っています
システムコール
ioctl
/proc & /sys
ネットリンク
知りたい
他のインターフェイスを見逃した場合は?
大量のデータを交換する最速の方法はどれですか? (そして、私が参照できるそのような主張を裏付ける文書/メール/説明があれば)
おすすめのコミュニケーション方法は?(ネットリンクだと思いますが、それでも意見を聞きたいです)
カーネルとユーザー空間プログラム間の次のインターフェースを介して情報交換が行われることを知っています
システムコール
ioctl
/proc & /sys
ネットリンク
知りたい
他のインターフェイスを見逃した場合は?
大量のデータを交換する最速の方法はどれですか? (そして、私が参照できるそのような主張を裏付ける文書/メール/説明があれば)
おすすめのコミュニケーション方法は?(ネットリンクだと思いますが、それでも意見を聞きたいです)
膨大な量のデータを交換する最速の方法は、メモリ マッピングです。デバイス ファイルで mmap 呼び出しを使用すると、対応するカーネル ドライバーがカーネル メモリをユーザー アドレス空間にマップすることを決定できます。これの良い例は Video For Linux ドライバーで、フレーム バッファー ドライバーも同じように動作すると思います。V4L2 ドライバーがどのように機能するかについての適切な説明については、以下を参照してください。
memcopy のような操作が関係していないため、大量のデータのメモリ マッピングに勝るものはありません。物理的な基礎となるメモリは、カーネルとユーザー空間の間で効果的に共有されます。もちろん、すべての共有メモリメカニズムと同様に、カーネルとユーザー空間が同時に所有権を持っていると思わないように、同期を提供する必要があります。
カーネルと使用空間の間の共有メモリは実行可能です。
http://kerneltrap.org/node/14326
手順/例については。
かなり高速な名前付きパイプを使用することもできます。
これはすべて、共有しているデータ、同時にアクセスされているか、データがどのように構造化されているかによって異なります。単純なデータには呼び出しで十分な場合があります。
役立つこともある
幸運を
また、relay(以前のrelayfs)を検討することもできます。
「基本的に、relayfsは、カーネルコードから効率的に書き込むことができるCPUごとのカーネルバッファの集まりです。これらのバッファは、mmapしてユーザースペースから直接読み取ることができるファイルとして表されます。このセットアップの目的は、潜在的に大量のデータをカーネルに記録し、ユーザースペースに「リレー」できるようにする、可能な限り単純なメカニズムを提供します。」
もちろん、copy_from_user などを使用して共有メモリを作成できます。基本的に必要なのは file_operation 構造体を作成することだけですが、これははるかに高速な方法ではありません。ベンチマークはありませんが、最新のシステムでのシステム コールが最も速いはずです。私の推論は、それが最も最適化されているということです。以前は、ユーザー -> カーネルからアクセスするには、割り込みを作成する必要がありました。割り込みは、割り込みテーブル (配列) に移動し、割り込みハンドル (0x80) を見つけて、カーネル モードに移動します。これは非常に遅く、次に .sysenter 命令が登場しました。これにより、基本的にこのプロセスが非常に高速になります。詳細は省きますが、.sysenter はレジスタ CS:EIP からすぐに読み取り、変更は非常に高速です。それどころか、共有メモリはメモリへの書き込みとメモリからの読み取りを必要とします。
以下は、考えられるすべてのインターフェースをまとめたものですが、いくつかの点で互いに重複しています (たとえば、ソケットとシステム コールはどちらも効果的にシステム コールを使用しています)。
Procfs
Sysfs
Configfs
Debugfs
Sysctl
devfs (eg, Character Devices)
TCP/UDP Sockets
Netlink Sockets
Ioctl
Kernel System Calls
Signals
Mmap