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を超える一致にアクセスしたり、明示的に言及されていない再帰を検索したりする必要はありません。正解は

はい!

おすすめ記事