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?
をカーネル空間での再帰呼び出しの数千人が良いデザインの決定のような音はありません作ります私に。カーネルスペースに入るのは本当に必要ですか?ユースケースとは何ですか?あなたが解決しようとしている元の問題は何ですか?あなたはそれをさらに分割することはできないので、再帰はユーザ空間で行われ、最小限のものだけがカーネル空間にあります。 –
アプリケーションはイーサネットパケットを分析することです。要件は、アプリケーション全体がイーサネットドライバにリンクされるカーネルモジュールでなければならないため、パケットをラインレートで分析できるようにする必要があります。分析するために、パケットは再帰ハッシュテーブルに格納されます。ところで、カーネルの再帰が良い設計ではない理由を説明してください。 – Karthik