在启动时加载内核模块会阻塞?

在启动时加载内核模块会阻塞?

我在启动时加载内核模块,将其添加到 /etc/modules-load.d/ 中的配置文件中,该模块加载正确。

在我的模块中,我使用 wait_for_random_bytes() 函数linux/随机.h,所以我的模块在加载时可能会有一些延迟。

模块是按顺序加载的吗?我的这个模块可以延迟其他模块的加载吗?谢谢!

答案1

操作系统的作用是什么?

在我的 Debian 中(但我敢打赌你的 C​​entOS 也会做同样的事情),初始化的模块加载部分是由/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 函数的一部分,那么是的,它可能会阻止其他模块加载。

相关内容