init 如何确定要对哪些设备进行 modprobe?

hoo*_*enz 5 linux networking init init.d

我正在为网络引导项目构建一个完全自定义的 initramfs,并在此过程中学习了很多关于它的知识,但我对模块的加载感到有些困惑。

我知道modprobe可以用来加载模块,但它如何决定加载哪些模块?

我现在拥有的是 initramfs 在虚拟框中启动并运行 shell。但lsmod显示没有加载模块。我需要init做的是为网络加载正确的模块,以便我可以启动网络。

如果我modprobe e1000真的加载了正确的模块。

在查看 Ubuntu 启动过程时,我看不到 Ubuntu 如何决定它应该加载e1000。我会认为它只是modprobe每个可用的网卡驱动程序,但它似乎并没有这样做。

我猜UDEV与它有关吗?

Ram*_*esh 7

我知道 modprobe 可用于加载模块,但它如何决定加载哪些模块?

当内核需要一个不在内核中的特性时,内核模块守护进程kmod1执行modprobe来加载模块。modprobe以两种形式之一传递一个字符串。

  • 模块名称,如 softdog 或 ppp。
  • 更通用的标识符,如 char-major-10-30

所以,让我解释一下我在系统中发现的内容,而不是从链接粘贴。

cat /proc/modules - 此命令列出了加载的模块,并且该列表是一个非常大的列表。

现在,在系统启动期间,正如我已经提到的,kmod守护进程执行modprobe加载模块。我们可以用已经讨论过的两种方式之一指定要加载的模块。如果我们指定了通用标识符,它将在/etc/modprobe.conf别名中查找该条目。因此,在 my 中/etc/modprobe.conf,我有一个别名,如下所示。

alias eth0 tg3
Run Code Online (Sandbox Code Playgroud)

因此,我运行以下命令来检查系统中的 tg3 是什么。

-bash-3.2$ cat /proc/modules | grep tg3
tg3 139225 0 - Live 0xf8bd1000
Run Code Online (Sandbox Code Playgroud)

接下来,modprobe查看文件/lib/modules/version/modules.dep,查看是否必须在加载请求的模块之前加载其他模块。此文件由depmod -a模块依赖项创建并包含它。

最后,modprobe用于insmod首先将任何必备模块加载到内核中,然后是请求的模块。modprobe引导insmod/lib/modules/version/[3],标准目录模块。insmod旨在对模块的位置相当愚蠢,而modprobe知道模块的默认位置,知道如何找出依赖关系并以正确的顺序加载模块。

但是如何检测到新硬件呢?

                                    CPU 特权环

这些环是由 CPU 创建的,而不是由操作系统创建的。任何操作系统内核都在最高特权级别的 Ring 0 中运行,可以直接与硬件和 CPU 通信。环 1 和环 2 通常用于设备驱动程序。环 3 用于用户空间应用程序(媒体播放器、Web 服务器和用户可以直接与之通信的任何其他内容)。设备驱动程序是用户空间应用程序和硬件之间的“桥梁”。

Linux 内核会不断扫描您所有计算机总线上的任何更改和新硬件。一旦检测到任何总线上的任何变化,魔法就会开始。

魔法

  1. 将硬件信息导出到用户空间 (SYSFS)
  2. *通知用户空间工具硬件可用(UEVENT 和 UDEVD)
    • 是的,你的假设是正确的。udev 与魔法有关 :)*
  3. 处理事件,根据 /ETC/UDEV/RULES.D/ 中的规则匹配它们并填充 /DEV 目录(UDEVD 和 UDEV)
  4. 负载设备驱动程序(UDEV、MODPROBLE)
  5. 通知用户空间应用程序(通过 D-BUS)

Udevd 只是一个站在内核和所有 udev 系统之间的守护进程,并执行一些重要的功能(我稍后会提到它们)。udev 守护进程 (udevd) 在启动时启动,然后读取并解析在 /etc/udev/rules.d/ 中找到的所有规则,并将这些规则保存在内存(udev 数据库)中以供 udev 进一步使用。后来 udevd 开始在 netlink 上侦听来自内核驱动程序核心的 uevents。

参考