我在启动时加载内核模块,将其添加到 /etc/modules-load.d/ 中的配置文件中,该模块加载正确。
在我的模块中,我使用 wait_for_random_bytes() 函数linux/随机.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
是一个 shell 函数,它解析各种文件和目录(包括/etc/modules-load.d
)并构建要加载的模块列表。load_module
是一个 shell 函数,modprobe
如果设置了 verbose 标志,它会完成工作 + 一些日志记录。
所以我想说,是的,模块是按顺序加载的,如果一个模块阻塞,那么它将阻塞其他模块......
但 ...
什么内核是做什么的?
当阅读源码时linux/模块.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 函数的一部分,那么是的,它可能会阻止其他模块加载。