7

我正在使用涉及内核和用户空间代码的大型嵌入式软件(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() 这就是我坚持的地方,因为

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

有没有人知道还有什么可以看和探索的?

4

2 回答 2

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>
于 2014-09-02T16:06:12.030 回答
1

首先,您应该是执行此操作的超级用户。你也可以使用,但这个选项可能非常危险:除非在编译内核时设置rmmod -f它,否则它不起作用。CONFIG_MODULE_FORCE_UNLOAD使用此选项,您可以删除正在使用的模块,或未设计为删除的模块,或已标记为不安全的模块。

也读man rmmod

于 2012-12-13T10:51:18.350 回答