让我们假设一个 Linux 系统已启动并正常运行的场景。一个用户出现并且热插拔USB 存储设备。
事件发生的顺序如下图所示:
modprobe 将其驱动程序加载到哪里?所请求设备的驱动程序是在/sys/bus/drivers
modprobe 加载之后还是之前找到的?
/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
)。