You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

执行modprobe时内核的处理流程及modprobe与insmod的区别

modprobe内核处理流程

当执行modprobe <模块名>时,整个流程分为用户空间工具处理和内核空间处理两部分:

  1. 用户空间modprobe工具预处理

    • 首先读取/lib/modules/$(uname -r)/modules.dep文件,解析目标模块的所有依赖项,按依赖顺序依次准备加载这些模块。
    • 若指定了模块参数,会读取/etc/modprobe.d/下的配置文件或命令行参数,整理好要传递给内核的参数。
    • 调用内核提供的系统调用(内核3.8及以上用finit_module,更早版本用init_module),将模块文件(或文件描述符)和参数传给内核。
  2. 内核空间处理流程

    • 合法性校验:内核先验证模块的签名(如果开启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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.01 15:50:25