Linux
在引導時載入核心模組是否阻塞?
我在啟動時載入核心模組,我將它添加到 /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 函式的一部分,那麼是的,它可能會阻止其他模組的載入。