起動時にカーネルモジュールのロードがブロックされますか?

起動時にカーネルモジュールのロードがブロックされますか?

起動時にカーネルモジュールをロードし、/etc/modules-load.d/の設定ファイルに追加し、モジュールが正しくロードされました。

私のモジュールはwait_for_random_bytes()関数を使います。Linux/random.hしたがって、モジュールのロードが若干遅れることがあります。

モジュールは順番にロードされていますか?私のモジュールは他のモジュールのロードを遅らせることができますか?ありがとうございます!

答え1

オペレーティングシステムの役割は何ですか?

私のDebianでは(しかしCentOSも同じことをするだろうと確信しています)、初期化のモジュールロード部分は/etc/init.d/kmod

以下はスクリプトから抜粋したものです。

files=$(modules_files)
if [ "$files" ] ; then
  grep -h '^[^#]' $files |
  while read module args; do
    [ "$module" ] || continue
    load_module "$module" "$args"
  done
fi

どこ:

  • modules_files/etc/modules-load.dさまざまなファイルとディレクトリ(インクルード)を解析してロードするモジュールのリストを作成するシェル関数。

  • load_modulemodprobe詳細フラグが設定されている場合はタスク+いくつかのロギングを実行するシェル関数です。

はい、モジュールは順番にロードされます。あるモジュールがブロックされると、他のモジュールもブロックされます。

しかし...

 コアは何をしますか?

ソースコードを読むときLinux/module.c私達はそれを見ることができます:

  • システムコールは関数として実装できますload_module()。多くのタスク(初期化、メモリ割り当て、整合性チェック、署名チェックなど)を実行して返しますreturn do_init_module(mod);3927号線

  • このdo_init_module()機能は以下で実行されます。3574ライン次の操作を行い、すべてが正常な場合は0を返します。

    if (mod->init != NULL)
        ret = do_one_initcall(mod->init);
    if (ret < 0) {
        goto fail_free_freeinit;
    }

私の結論は、次の場合にのみシステムコールが返されることです。 1. モジュールがメモリにロードされました。 2. init() 関数が正常に実行されました。

したがって、呼び出しがwait_for_random_bytes()モジュール初期化関数の一部である場合はそうです。他のモジュールがロードされない可能性があります。

関連情報