modprobe 在哪里加载 udev 请求的驱动程序?

modprobe 在哪里加载 udev 请求的驱动程序?

让我们假设一个 Linux 系统已启动并正常运行的场景。一个用户出现并且热插拔USB 存储设备。

事件发生的顺序如下图所示:

在此输入图像描述

modprobe 将其驱动程序加载到哪里?所请求设备的驱动程序是在/sys/bus/driversmodprobe 加载之后还是之前找到的?

/sys/我在这里试图建立的是上图中的条目和发生的事件之间的关系。

答案1

uevent 消息包含有关设备的信息(例子)。此信息包含连接到 PCI 和 USB 等总线的设备的已注册供应商和型号标识。 Udev 解析这些事件并构造一个固定格式的模块名称,并将其传递给modprobe.modprobe在下面查找/lib/modules/VERSION一个名为的文件,该文件depmod.alias是在安装内核时生成的,并将固定格式的模块名称映射到实际的驱动程序模块文件名。看驱动模块是否自动加载和卸载?有关该过程的更多详细信息 — 该答案描述了内核modprobe直接调用的早期情况,但模块别名的工作方式modprobe并没有改变。

也可以看看Michael Opdenacker 的演讲“使用 udev 进行热插拔”其中有更多示例并描述了使用 udev 进行设备管理的其他方面,以及Linux 从头开始​​指南其中有一节介绍如何定义固定格式模块名称。

modprobe通过调用加载模块init_module系统调用。它不以任何方式与 sysfs 交互。当模块被加载时,内核会在 中为其创建一个条目/sys/module。出现在 sysfs 中其他位置的任何条目都取决于模块中的代码(例如,具有 USB 设备类型驱动程序的模块将调用一些在 下添加条目的通用 USB 支持代码/sys/bus/usb/drivers)。

相关内容