启动时加载linux内核模块的顺序是什么?他们的优先级如何?

启动时加载linux内核模块的顺序是什么?他们的优先级如何?

我有一个动态编译的 Linux 内核模块。如何添加到启动中?里面有很多.ko文件/lib/modules。如何设置加载这些模块的优先级?

答案1

它们不会在启动时或任何其他时间自动加载,尽管其中很多最终会在引导期间加载。发生这种情况的机制有三种:

  • 用户空间请求:其中涵盖了从 init 服务到 udev 再到命令行的所有内容。如果您想在启动时加载特定模块,Init 或 udev 可能是最直接的方法。

  • 热插拔设备:当您将某些设备连接到 USB 或 PCI 等设备时,内核会检测到这一点并根据设备识别自身的方式请求适当的模块。

  • 所需的协议或其他实现:当内核需要执行某些操作(例如读取文件系统)并发现它缺乏执行此操作的知识时,它将请求一个模块。

请注意,对于最后两个,我使用了短语“请求模块”——这是因为内核实际上是通过用户空间守护进程加载的,kmod该守护进程执行/sbin/modprobe.根据沃尔夫冈·毛雷尔 (Wolfgang Mauerer) 的说法Linux内核架构,在 2.6 内核中只有大约 100 个调用内部request_module()函数的不同点。

modprobe使用已安装的 MODULE_ALIAS 的数据库。这些在模块源代码中明确指定,或者从模块的 MODULE_DEVICE_TABLE 派生,该表是模块服务的 OEM 设备 ID 列表。

答案2

许多系统被设置为使用initrd 或 initramfs。这些是由引导加载程序加载的文件系统映像,并在挂载根分区之前可供内核使用。这允许挂载根分区所需的驱动程序(磁盘驱动程序、文件系统驱动程序、设备映射器或逻辑卷驱动程序等)被编译为模块并从 initrd/initramfs 加载。

initrd ( /linuxrc) 或 initramfs ( /init) 上的启动脚本通常会加载一些模块并定位根文件系统。每个发行版都有自己的设置。 Ubuntu 使用一个初始化文件系统它由initramfs-tools包中的组件组装而成,并根据安装根文件系统所需的驱动程序为每个内核重新生成。

挂载根文件系统后,在系统引导期间,会加载/etc/modules(Debian, …) 或(Red Hat, Arch, …) 中列出的模块。/etc/modules.conf该文件通常列出几个模块(如果有)。大多数模块都是按需加载的。

当内核检测到某些硬件缺少驱动程序或某些其他组件(例如网络协议或加密算法)时,它会调用/sbin/modprobe加载模块。对于硬件驱动程序,内核传递编码 PCI id、USB id 或硬件的其他系统名称的名称。其中有一个表/lib/modules/$VERSION/modules.alias将这些系统名称映射到模块名称。该表由 生成depmod并由 读取modprobe

如果您有为硬件设备手动编译的额外内核模块,请将其放入/lib/modules/$VERSION/locallocal如果不存在则创建子目录)并运行depmod -a以重新生成别名数据库。如果该模块用于内核无法自动检测到的某些异常功能,请将其放入 中/lib/modules/$VERSION/local,运行depmod -a以分析其依赖关系,并将模块名称添加到 中/etc/modules

相关内容