Linuxカーネル(特に2.6以降)に再帰機能がありますか?

Linuxカーネル(特に2.6以降)に再帰機能がありますか?

カーネルスタックの限られた固定サイズを考えると、理論的には再帰があまりにも深くなければ再帰関数を持つことができますが、実用主義では安全のためにすべての再帰関数を取り除くことをお勧めします。結局のところ、再帰が多すぎると* thread_info_t *構造がクリアされ、カーネルパニックが発生する可能性があります。

答え1

はい!

いくつかの再帰呼び出しが記録されるか、関数名の一部になることができますか?その後、find / grepはそれを表示する必要があります。これを行うコマンドは次のとおりです。

find /usr/src/linux/ -name "*.c" -exec grep recursive {} ";" -ls 

Piping | wc -lは270個を提供します。つまり、-lsは各ファイルに追加の行を印刷するため、少なくとも135個のファイルと機能があります。

最初のゲームを見てみましょう。

/usr/src/linux/fs/jfs/jfs_dmap.c

大会に関するコメントは次のとおりです。

  • dmap コントロールページ自体の調整により
  • ルートは変更を行い、この変更は次のdmapまで表示されます。
  • このルーチンを再帰的に呼び出してレベルを制御し、以下を指定します。
  • 新しいルート値と次のdmap制御ページレベル
  • 調節される。

メソッドの前に

static int
dbAdjCtl(struct bmap * bmp, s64 blkno, int newval, int alloc, int level)

実際、ライン2486とその隣人は次のようになります。

if (dcp->stree[ROOT] != oldroot) {
    /* are we below the top level of the map.  if so,
     * bubble the root up to the next higher level.
     */
    if (level < bmp->db_maxlevel) {
        /* bubble up the new root of this dmap control page to
         * the next level.
         */
        if ((rc =
             dbAdjCtl(bmp, blkno, dcp->stree[ROOT], alloc,
                  level + 1))) {
            /* something went wrong in bubbling up the new
             * root value, so backout the changes to the
             * current dmap control page.
             */

なぜなら質問は、どの再帰機能を使用すると、次の135を超える一致にアクセスしたり、明示的に言及されていない再帰を検索したりする必要はありません。正解は

はい!

答え2

これLinuxカーネルコーディングスタイル再帰関数は禁止されません。

スタックがオーバーフローしないように注意する必要がありますが、この注意は再帰関数に固有のものではありません。ループが利用可能な場合は、理由なく再帰を使用しないでください。、そしてあなたを覚えています。そしてあなたの機能を呼び出す合計8kBしかありませんが、時には再帰は正しいツールです。

答え3

現在、カーネルには千万行を超えるコードがあります。私はこれらすべてのコード行がどこかで再帰的であると確信しています。再帰プログラミングは非常に強力なので、報酬を得るために多くのレベルを実行する必要はありません。

関連情報