Linux

在引導時載入核心模組是否阻塞?

  • November 20, 2019

我在啟動時載入核心模組,我將它添加到 /etc/modules-load.d/ 中的配置文件中,模組載入正確。

在我的模組中,我使用了linux/random.h中的 wait_for_random_bytes() 函式,因此我的模組在載入時可能會有一些延遲。

模組是按順序載入的嗎?我的這個模組可以延遲其他模組的載入嗎?謝謝!

作業系統做什麼?

在我的 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是一個 shell 函式,它解析各種文件和目錄(包括/etc/modules-load.d)並建構要載入的模組列表。
  • load_module是一個 shell 函式,modprobe如果設置了詳細標誌,則可以完成工作 + 一些日誌記錄。

所以我會說是的,模組是按順序載入的,如果一個模組阻塞,那麼它將阻塞其他模組……

但 …

 什麼核心?

在閱讀linux/modules.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()是模組的 init 函式的一部分,那麼是的,它可能會阻止其他模組的載入。

引用自:https://unix.stackexchange.com/questions/553117