4

8 mbps 近くの TCP/IP パケットを取得するカーネル モジュールを作成したいと考えています。これらのパケットを 500ms の間保存する必要があります。その後、これらのパケットは順番に転送する必要があります。そして、これらは 30 人のメンバーに対して行う必要があります。実装するための最良のアプローチは何ですか?kmalloc一度使用する必要があり(kmalloc(64000000, GFP_ATOMIC)ますか?毎回行うkmallockfree時間がかかり、パフォーマンスの問題につながるからです。また、カーネルにメモリを一度に割り当てた場合、Linux カーネルはそれを許可してくれますか?

4

2 に答える 2

6

私はかつて、10Gbs リンクでパケットを処理するカーネル モジュールを作成しました。以前vmallocは、約 1GByte の連続 (仮想) メモリを割り当てて、静的サイズのハッシュ テーブルをそこに配置し、接続追跡 ( code ) を実行していました。

必要なメモリ量がわかっている場合は、事前に割り当てることをお勧めします。これには2つの利点があります

  • 高速です(実行時のmallocing/freeingはありません)
  • kmalloc(_, GFP_ATOMIC)記憶が戻らなければ作戦を考える必要はありません。これは実際には、負荷が高い場合に非常に頻繁に発生する可能性があります。

不利益

  • 必要以上のメモリを割り当てる場合があります。

したがって、専用のカーネル モジュールを作成するには、できるだけ多くのメモリを事前に割り当ててください ;)

多くの初心者ユーザーが使用するコモディティ ハードウェア用のカーネル モジュールを作成する場合は、必要に応じてメモリを割り当てる (そしてメモリの無駄を少なくする) とよいでしょう。


メモリをどこに割り当てますか?GFP_ATOMIC非常に少量のメモリしか返せないため、メモリ割り当てがスリープできない場合にのみ使用する必要があります。GFP_KERNELスリープしても安全な場合、たとえば割り込みコンテキストではない場合に使用できます。詳細については、この質問を参照してください。vmallocモジュールの初期化中にすべてのメモリを事前に割り当てるために安全に使用できます。

于 2013-03-26T08:22:33.217 に答える