我正在使用涉及内核和用户空间代码的大型嵌入式软件(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(),这就是我卡住的地方,如
我不确定那里到底发生了什么。我认为根本原因是守护进程中的某个地方打开了与模块的连接,显然是其他东西并且在退出时没有正确关闭/清理(显然有些引用/锁没有被释放?)
有没有人知道还有什么可以查看和探测?
答案 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
。