Linux内核模块加载与卸载:request_module()与insmod/rmmod

需积分: 50 61 下载量 111 浏览量 更新于2024-08-09 收藏 3.66MB PDF 举报
"本文主要探讨了如何在小米手环方案中卸载所有可卸载的模块,以及在Linux内核中实现模块管理的相关系统调用。重点讲述了request_module()函数的作用,该函数用于内核主动加载模块。" 在Linux系统中,模块卸载是一个关键过程,特别是对于可动态加载的内核模块。当满足特定条件时,如模块不再被其他模块依赖、具有MOD_AUTOCLEAN标志、正在运行且尚未开始卸载、被使用过但已不再使用,系统会允许卸载这些模块。内核提供了一些系统调用来处理模块的生命周期,如init_module()用于初始化模块,create_module()用于创建模块,delete_module()用于删除模块,以及query_module()用于查询模块信息。这些调用在实现insmod和rmmod命令时会被调用,但通常不建议用户直接使用。 request_module()函数是内核主动加载模块的核心机制,它位于kernel/kmod.c中。该函数接受模块名称作为参数,尝试使用用户模式的模块加载器来加载模块。函数返回0表示成功,负值表示失败。即使模块成功加载,也并不意味着它不会因自身错误而立即卸载,因此调用者必须检查所需服务是否可用,而不是盲目地调用。如果模块自动加载支持被禁用,request_module()将变成一个空操作。 在某些场景下,内核需要主动加载模块,比如响应网络中的特殊数据包或检测到新硬件。request_module()在这些情况下被调用,以确保内核能够根据需要加载相应的支持模块。此外,内核会进行一些检查,例如确保根文件系统已经挂载,以防止在不安全的状态下加载模块。 深入理解Linux内核源代码的书籍对此类话题提供了详细的解释,包括内核模块管理的底层机制和实现细节。作者通过实例和代码分析,帮助读者理解如何与内核交互,如何编写和管理内核模块,以及内核如何处理模块的加载和卸载请求。这对于想要进行内核开发或者优化系统性能的开发者来说是非常有价值的资源。