无法“rmmod”模块

时间:2012-12-12 19:33:29

标签: linux linux-kernel kernel-module

我正在使用涉及内核和用户空间代码的大型嵌入式软件(ARM处理器,嵌入式Linux 2.6.31,busybox)。首先加载内核模块,然后守护进程与模块建立netlink套接字。

这里的问题是在杀死守护进程后,我无法再从内存中卸载模块:

% rmmod _module.ko
% rmmod: _module.ko: Resource temporarily unavailable

分析显示错误(返回值为-11,即EAGAIN?)由try_stop_module()中的系统调用delete_module()定义中调用的kernel/module.c返回。函数try_stop_module()依次调用stop_machine(),这就是我卡住的地方,如

我不确定那里到底发生了什么。我认为根本原因是守护进程中的某个地方打开了与模块的连接,显然是其他东西并且在退出时没有正确关闭/清理(显然有些引用/锁没有被释放?)

有没有人知道还有什么可以查看和探测?

2 个答案:

答案 0 :(得分:2)

检查与您的模块相关的所有接口是否都没有“启动”。

如果与您的模块相关的任何接口是“up”,则rmmod将失败并返回-11。

所以在调用rmmod之前, 使用'netcfg'命令检查活动接口。 然后使用ifconfig,将您的界面设为'ifconfig <interface_name> down'

然后尝试运行rmmod <module_name>。 它会工作!!

1.netcfg <lists out all interfaces>
2.ifconfig <interface_name> down
3.rmmod <module_name>

答案 1 :(得分:1)

首先,你应该是一个超级用户来做到这一点。您也可以使用rmmod -f,但此选项可能非常危险:除非在编译内核时设置了CONFIG_MODULE_FORCE_UNLOAD,否则它无效。使用此选项,您可以删除正在使用的模块,或者不是要移除的模块,或者已被标记为不安全的模块。

另请阅读man rmmod