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