执行modprobe时内核的处理流程及modprobe与insmod的区别
modprobe内核处理流程
当执行modprobe <模块名>时,整个流程分为用户空间工具处理和内核空间处理两部分:
用户空间modprobe工具预处理
- 首先读取
/lib/modules/$(uname -r)/modules.dep文件,解析目标模块的所有依赖项,按依赖顺序依次准备加载这些模块。 - 若指定了模块参数,会读取
/etc/modprobe.d/下的配置文件或命令行参数,整理好要传递给内核的参数。 - 调用内核提供的系统调用(内核3.8及以上用
finit_module,更早版本用init_module),将模块文件(或文件描述符)和参数传给内核。
- 首先读取
内核空间处理流程
- 合法性校验:内核先验证模块的签名(如果开启
CONFIG_MODULE_SIG配置),检查模块架构、内核版本、符号版本是否与当前系统匹配,确保模块可以安全加载。 - 内存分配与加载:为模块分配内核内存空间,将模块的二进制代码、数据段加载到内核地址空间,完成重定位(解析模块中引用的内核符号)。
- 模块初始化:调用模块的
init_module函数(即驱动代码中module_init宏指定的入口)。如果模块需要硬件固件,此时会调用request_firmware接口触发固件加载流程:内核通知用户空间的固件服务(如udev)到/lib/firmware/目录查找对应固件,加载后传递给模块。 - 硬件与中断处理:固件加载完成后,模块继续初始化,注册设备驱动、中断处理函数等。当硬件触发中断时,内核会根据中断优先级调度对应的中断处理函数执行,完成设备的初始化工作。
- 模块注册:将模块加入内核的模块列表,更新模块依赖关系,完成加载流程。
- 合法性校验:内核先验证模块的签名(如果开启
modprobe与insmod的核心区别
- 依赖处理:
modprobe会自动解析并递归加载目标模块的所有依赖模块;insmod不处理依赖,必须手动提前加载所有依赖模块,否则加载失败。 - 模块查找:
modprobe默认从/lib/modules/$(uname -r)/目录(依据modules.dep)查找模块,无需指定完整路径;insmod必须提供模块文件的完整路径或当前目录下的模块文件名。 - 系统调用与安全性:
modprobe优先使用更安全的finit_module系统调用(直接传递文件描述符,避免路径注入风险);insmod仅使用init_module调用。 - 功能扩展性:
modprobe支持丰富的参数与配置,比如-r卸载模块及依赖、-v输出详细日志、-n模拟加载;还可通过/etc/modprobe.d/配置模块参数、黑名单等;insmod功能单一,仅负责加载模块,卸载需使用rmmod。 - 使用场景:
modprobe是日常加载模块的首选工具,适合大部分场景;insmod多用于调试或仅需加载单个无依赖模块的场景。
内容的提问来源于stack exchange,提问作者Malavika
相关产品推荐
相关产品推荐

