insmod 和 modprobe 的区别?

2025年3月17日 | 阅读 3 分钟

在本文中,我们将讨论 **insmod 和 modprobe** 及其区别。

Insmod

Difference between Insmod and Modprobe

将内核模块文件名以及模块接受的任何模块特定参数在插入时作为 **参数** 传递给 **insmod

在 **Linux 系统** 上,使用 **insmod 命令** 将模块插入内核。作为增加内核功能的一种方式,Linux 操作系统允许用户在运行时加载内核模块。

由于实际的模块连接工作是在内核本身完成的,因此 **insmod** 可能产生的错误消息都非常笼统。通过 **dmesg** 观察错误是最好的方法,因为任何发出的错误都是由内核产生的。

通常,insmod 用于开发过程中加载模块,并且需要提供要加载模块的路径。

$ insmod filename [module-options]

Modprobe

**Rusty Russell** 创建的 **modprobe** 工具可以向 Linux 内核添加或从中删除可加载的内核模块。它经常以间接方式使用,因为 udev 使用 modprobe 来加载自动识别的硬件的驱动程序。

modprobe 会加载主模块和依赖模块。除了加载所需的模块外,insmod 还会加载它检测到的任何其他必需模块。但是,为了从当前目录加载自定义模块,您仍然需要 insmod,因为 modprobe 只搜索标准的已加载模块目录。相比之下,modprobe 通常由系统管理员或在生产系统中使用。Modprobe 是一个智能命令,它分析 modules.dep 文件,首先加载依赖项,然后再加载指定的模块。就像包管理器一样,它会自动管理模块依赖项。

$ modprobe module-name

insmod 和 modprobe 的区别?

insmodmodprobe
模块使用指定的“insmod /path/to/module.ko”进行加载。模块仅在 /lib/modules/$ (uname -r) 中加载。运行“modprobe /home/test/hello.ko”将不起作用。
如果存在任何依赖项,它们不会被加载。在 modprobe 加载了依赖项之后,主模块才会被加载。
使用 insmod 会导致依赖项未加载,从而导致“未解析的符号”等编译问题。在这种情况下,我们必须手动查找任何依赖模块并加载它们以修复问题。加载模块时,智能命令 modprobe 会检查依赖项。假设我们加载了一个模块,该模块在另一个模块中定义了符号(该模块路径在主模块内给出)。因此,modprobe 会加载主模块和依赖模块。
insmod 命令无法提供更多功能。与更简单的 insmod 和 rmmod 工具相比,modprobe 命令提供了更多功能。

modprobe 如何确定依赖项?

Modprobe 使用 depmod 工具来确定依赖项。Depmod 确定 **/lib/modules/$(uname -r) 文件夹** 中每个模块的依赖项,并将信息存储在 **/lib/modules/$(uname -r)/modules.dep 文件** 中。

例如,

kernel/drivers/net/wireless/admtek/adm8211.ko: kernel/net/mac80211/mac80211.ko kernel/net/wireless/cfg80211.ko kernel/drivers/misc/eeprom/eeprom_93cx6.ko

在这种情况下,eeprom_93cx6.ko、cfg80211.ko 会先加载,然后是 adm8211.ko。

模块从左到右删除,从右到左加载。因此,在删除时,adm8211.ko 会被移除,然后是 cfg80211.ko,最后是 eeprom_93cx6.ko。

可以通过运行 **“depmod -a”** 命令重新加载 **modules.dep** 文件。

总结

系统管理命令 insmod 使用模块文件名将其加载到内核中。它比 modprobe 命令简单但适应性较差。因为内核在内部执行模块操作,并将错误数据发送到内核日志而不是标准输出。insmod 的错误消息可能含糊不清。

modprobe 命令使用 module.* 文件中的信息。用户可以通过名称查找模块,而不是使用完整路径。modprobe 还有许多在手册中详细说明的其他功能。

设备管理器,特别是 udev,利用有关模块依赖项的信息。当检测到新硬件(例如新的 USB 设备)时,供应商会通知 udevd 守护程序并将其传递。然后从硬件读取产品 ID 并将其传递给供应商。udevd 会搜索模块依赖项文件以查找注册了这些 ID 的模块。如果发现任何 ID,它就会使用 modprobe 加载。


下一主题区别