2016-05-24 10 views
0

ユーザアプリケーションをカーネルモジュールに変換しています。カーネルモジュールは200Mを使用します(すべてのメモリはvmalloc()によって取得されます)。このメモリは再帰ハッシュテーブルに使用されます。私はハッシュテーブルを削除するために再帰関数を使用しています。再帰呼び出しの数は、使用される合計メモリが200Mであり、すべての単一ハッシュテーブルのサイズがちょうど256 * 8であるため、数千になる可能性があります。オーバーフローを防ぐためにカーネルモジュールの現在のスタック使用量を調べる方法は?

再帰関数を使用してハッシュテーブルを削除すると、カーネルがクラッシュすることがあります。同じアプリケーションをユーザー空間で実行すると、クラッシュせず完全に実行されます。いくつかのグーグルをやった後、私は再帰をしながらスタックのオーバーフローが原因である可能性があると思う。問題を確認/隔離するために、カーネルモジュール/プロセスの現在のスタック使用状況を表示する方法はありますか?

+8

をカーネル空間での再帰呼び出しの数千人が良いデザインの決定のような音はありません作ります私に。カーネルスペースに入るのは本当に必要ですか?ユースケースとは何ですか?あなたが解決しようとしている元の問題は何ですか?あなたはそれをさらに分割することはできないので、再帰はユーザ空間で行われ、最小限のものだけがカーネル空間にあります。 –

+0

アプリケーションはイーサネットパケットを分析することです。要件は、アプリケーション全体がイーサネットドライバにリンクされるカーネルモジュールでなければならないため、パケットをラインレートで分析できるようにする必要があります。分析するために、パケットは再帰ハッシュテーブルに格納されます。ところで、カーネルの再帰が良い設計ではない理由を説明してください。 – Karthik

答えて

2

CONFIG_DEBUG_STACKOVERFLOWと呼ばれるデバッグオプションがあります。スタックオーバーフローがあなたを噛んでクラッシュする前にキャッチするのに役立ちます。

しかし、これは割り込み処理の中でアーチ固有の方法で実装されています。 v4.6として、これをサポートするアーキテクチャは次のとおりです。

$ git grep "select HAVE_DEBUG_STACKOVERFLOW" v4.6 
v4.6:arch/arc/Kconfig: select HAVE_DEBUG_STACKOVERFLOW 
v4.6:arch/blackfin/Kconfig:  select HAVE_DEBUG_STACKOVERFLOW 
v4.6:arch/frv/Kconfig: select HAVE_DEBUG_STACKOVERFLOW 
v4.6:arch/m32r/Kconfig: select HAVE_DEBUG_STACKOVERFLOW 
v4.6:arch/metag/Kconfig:  select HAVE_DEBUG_STACKOVERFLOW 
v4.6:arch/mips/Kconfig: select HAVE_DEBUG_STACKOVERFLOW 
v4.6:arch/mn10300/Kconfig:  select HAVE_DEBUG_STACKOVERFLOW 
v4.6:arch/openrisc/Kconfig:  select HAVE_DEBUG_STACKOVERFLOW 
v4.6:arch/parisc/Kconfig:  select HAVE_DEBUG_STACKOVERFLOW 
v4.6:arch/powerpc/Kconfig:  select HAVE_DEBUG_STACKOVERFLOW 
v4.6:arch/tile/Kconfig: select HAVE_DEBUG_STACKOVERFLOW 
v4.6:arch/x86/Kconfig: select HAVE_DEBUG_STACKOVERFLOW 

特に、ARMはそのリストにありません。

それは現在のスタックの深さを確認することがいかに簡単で見るのは興味深いです:

/* Debugging check for stack overflow: is there less than 1KB free? */ 
static int check_stack_overflow(void) 
{ 
     long sp; 

     __asm__ __volatile__("andl %%esp,%0" : 
          "=r" (sp) : "0" (THREAD_SIZE - 1)); 

     return sp < (sizeof(struct thread_info) + STACK_WARN); 
} 

、再帰に関するご質問について:それはあなたが正確に問題のために、カーネル開発の貧しいデザインです向いている。カーネルの土地では、スタックはと固定されており、となります。再帰は通常スタックが空いていて、簡単にオーバーフローするスタックにつながります。

ここで説明したように、あなたは常に、反復1に再帰アルゴリズムを変換することができます理論的にことに留意してください:Can every recursion be converted into iteration?

関連する問題