Linux Module

本文深入解析Linux中模块加载的两种方式:insmod和modprobe。insmod需要指定模块的绝对路径,并手动处理依赖关系;而modprobe则自动分析依赖并加载。文章详细介绍了/lib/modules目录的作用及维护方法。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

Linux Module

模块安装

手动安装模块时有insmod和modprobe,它们的区别是:

  • insmod在加载外部模块时要指定模块的绝对路径。多个外部模块有符号依赖时,要按依赖关系顺序加载。此时可以没有/lib/modules/kernel_release_version目录。
  • modprobe后边只需要去跟模块名称,它自动去分析/lib/module/kernel_release下module.dep文件。 去根据依赖自动加载。
    /lib/modules/目录以及下面的文件再module_install 创建的。 外部模块会被安装在extra下,最后使用depmod命令在kernel_version目录下生成外部模块依赖文件module.dep.
    所以如果使用insmod,/lib/modules/下的模块依赖文件可以没有。只要按照顺序insmod就可以正常工作。
    如果使用modprobe, 那么/lib/modules下的内容必须有。
### 关于Linux内核模块开发与故障排除 #### Linux内核模块的基础概念 Linux内核模块是一种动态加载到运行中的内核中的代码片段,用于扩展内核的功能而不需重新编译整个内核。这些模块可以提供设备驱动程序、文件系统支持或其他功能[^2]。 当UEFI安全启动被启用时,Linux内核可能会禁止使用UIO(Userspace I/O),因此建议将DPDK使用的设备绑定到`vfio-pci`内核模块而不是任何基于UIO的模块[^1]。这有助于确保系统的安全性以及兼容性。 #### 开发流程概述 编写一个简单的内核模块通常涉及以下几个方面: - **初始化函数**:定义模块加载时执行的操作。 - **清理函数**:指定卸载模块时要完成的任务。 - 使用宏`module_init()`注册初始化函数,用`module_exit()`声明退出函数。 下面是一个基本的例子展示如何创建一个最基础的hello world类型的内核模块: ```c #include <linux/module.h> /* 所有模块都需要 */ #include <linux/kernel.h> /* KERN_INFO 宏 */ static int __init hello_start(void){ printk(KERN_INFO "Loading Hello module...\n"); return 0; // 非零返回表示失败,模块无法加载 } static void __exit hello_end(void){ printk(KERN_INFO "Goodbye Mr.\n"); } module_init(hello_start); module_exit(hello_end); MODULE_LICENSE("GPL"); // 设置许可证为GPL ``` #### 常见问题排查方法 如果遇到错误或者异常行为,在调试过程中可考虑以下几点: - 查看dmesg日志获取更多信息; - 确认依赖项已正确定义并存在; - 如果涉及到硬件访问,则注意权限设置及隔离策略的影响,比如前面提到的安全引导限制情况下的VFIO应用。 另外需要注意的是,虽然NAPI机制增强了多核环境下的性能表现[^4],但在某些特定场景下也可能暴露出其自身的不足之处,所以在设计高性能网络应用程序时应综合考量各种因素。 #### 参考资料关联说明 上述讨论涵盖了从基础知识介绍到实际编码实践再到潜在障碍克服等多个层面的内容,并适当引用了相关参考资料来增强论述的专业性和权威度。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值