真实面经题目 · 原创解析
insmod 和 modprobe 有什么区别,驱动模块依赖如何处理?
这题考内核模块加载工具差异,回答要说明 insmod 只插入指定 ko,modprobe 会按模块库、别名和依赖自动加载。
真实面经题目 · 原创解析
这题考内核模块加载工具差异,回答要说明 insmod 只插入指定 ko,modprobe 会按模块库、别名和依赖自动加载。
insmod 和 modprobe 都能加载内核模块,但层级不同。insmod 很直接,只把你指定路径的 .ko 交给内核加载,不解析依赖、不查模块别名、不处理黑名单和配置;如果这个模块依赖的符号来自其他模块而那些模块没加载,就会失败。modprobe 是更高层工具,会在 /lib/modules/当前内核版本 下读取 modules.dep、modules.alias 等由 depmod 生成的索引,根据模块名或设备别名找到目标模块,先加载依赖模块,再加载目标模块,还会应用 /etc/modprobe.d 里的 options、blacklist、install/remove 规则。热插拔设备自动加载通常也是通过设备 modalias 触发 modprobe。面试里可以总结:调试单个 ko 可用 insmod,系统集成和依赖处理应使用 modprobe,并确保模块安装路径、depmod 和 MODULE_DEVICE_TABLE 正确。
它需要具体 ko 文件路径,基本不理解模块之间的依赖关系。内核加载时若发现未解析符号,只会报错,不会帮你找依赖模块。
modprobe 根据内核版本目录下的 modules.dep、modules.alias、modules.symbols 等文件查找模块和依赖。这些索引通常由 depmod 生成。
驱动里的 MODULE_DEVICE_TABLE 会生成可匹配硬件或设备树 compatible 的 alias。设备出现时用户态可根据 modalias 调用 modprobe 自动加载对应驱动。
modprobe 会读取配置文件里的参数、黑名单和自定义 install/remove 命令。系统启动和发行版集成通常依赖这些能力,而 insmod 不处理。
扫描模块目录,生成依赖、符号和别名索引,让 modprobe 能快速找到模块和依赖关系。
可能缺少 MODULE_DEVICE_TABLE、modules.alias 未更新、udev/modalias 没触发,或模块不在正确内核版本目录。
我会先看 dmesg 和返回码,再查 /sys 下设备、驱动和资源状态,必要时加 trace/ftrace 或最小日志,先证明问题出在设备生成、匹配、资源获取、回调路径还是用户态交互。