无法"rmmod"模块

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(),这就是我卡住的地方,

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

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

ymn*_*ymn 1

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

还读过man rmmod

  • 还有一件事——这里的主要问题是对模块的引用数量,即有多少进程正在使用该模块(/proc/net/modules 的第三个字段),不为零,因此该模块可以'不被卸载。在运行守护进程之前,引用计数器为 0,在启动守护进程之后,计数器上升到 6,尽管考虑到它打开了三个套接字,我预计只有 3。因此,杀死 damon 后,计数器会降至 3,因此无法卸载模块。有没有什么方法可以捕获其他描述符等保持打开状态? (2认同)