Mar*_*ark 7 linux kernel-module linux-kernel
我正在使用涉及内核和用户空间代码的大型嵌入式软件(ARM处理器,嵌入式Linux 2.6.31,busybox).首先加载一个内核模块,然后守护进程与模块建立netlink套接字.
这里的问题是在杀死守护进程后,我无法再从内存中卸载模块:
% rmmod _module.ko
% rmmod: _module.ko: Resource temporarily unavailable
Run Code Online (Sandbox Code Playgroud)
分析表明,错误(返回值是-11
,即EAGAIN
?)是try_stop_module()
在syscall delete_module()
定义中调用的kernel/module.c
.函数try_stop_module()依次调用stop_machine(),这就是我卡住的地方,
我不确定那里到底发生了什么.我认为根本原因是守护进程中的某个地方打开了与模块的连接,显然是其他东西并且在退出时没有正确关闭/清理(显然有些引用/锁没有被释放?)
有没有人知道还有什么可以看和探测?
首先,您应该是超级用户才能执行此操作。您也可以使用rmmod -f
,但此选项可能非常危险:除非CONFIG_MODULE_FORCE_UNLOAD
在编译内核时设置,否则它不会产生任何效果。使用此选项,您可以删除正在使用的模块、未设计为删除的模块或已标记为不安全的模块。
还读过man rmmod
。