最終更新:2015-10-26 (月) 17:30:44 (3547d)  

do_initcalls
Top / do_initcalls

カーネルソース中の随所に散らばる初期化関数を全て実行する

メモ

  • 初期化関数は全て __init_call? マクロと共に宣言され、ELFセクション「.initcall.init? 」に関数のポインタが格納されることにより、カーネルパラメータのパース関数と同じ要領で実行が行われる。
  • http://www.ctrlz.jp/techdoc/linuxboot/61-startcommon.html

呼び出し元

実装

  • static void __init do_initcalls(void)
    {
            int level;
    
            for (level = 0; level < ARRAY_SIZE(initcall_levels) - 1; level++)
                    do_initcall_level(level);
    }

do_initcall_level?

  • static void __init do_initcall_level(int level)
    {
            extern const struct kernel_param __start___param[], __stop___param[];
            initcall_t *fn;
    
            strcpy(static_command_line, saved_command_line);
            parse_args(initcall_level_names[level],
                       static_command_line, __start___param,
                       __stop___param - __start___param,
                       level, level,
                       &repair_env_string);
    
            for (fn = initcall_levels[level]; fn < initcall_levels[level+1]; fn++)
                    do_one_initcall(*fn);
    }
  • do_one_initcall