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

gan*_*bra 10 linux startup kernel-modules

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

gol*_*cks 12

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

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

  • 热插拔设备:当你将某些东西连接到例如 USB 或 PCI 时,内核会检测到这一点,并根据设备如何识别自己来请求一个适当的模块。

  • 需要的协议或其他实现:当内核需要做某事时,例如读取文件系统,并发现它缺乏这样做的知识,它将请求一个模块。

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

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


Gil*_*il' 5

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

\n\n

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

\n\n

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

\n\n

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

\n\n

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

\n