起動時にカーネルモジュールをロードし、/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_module
modprobe
詳細フラグが設定されている場合はタスク+いくつかのロギングを実行するシェル関数です。
はい、モジュールは順番にロードされます。あるモジュールがブロックされると、他のモジュールもブロックされます。
しかし...
コアは何をしますか?
ソースコードを読むとき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()
モジュール初期化関数の一部である場合はそうです。他のモジュールがロードされない可能性があります。