我曾经cat /proc/modules
列出过过程细节。下面的模块显示存在 4 个实例:
poe_isr 3046 4 - Live 0xc37e1000 (O)
这是什么意思?我如何查看这些实例的使用情况?如果模块显示为 0 个实例并且处于活动状态,这意味着什么?模块未加载仍然有效?
adcmods 1565 0 - Live 0xc37dd000 (P)
答案1
它是一个计数器。可以通过内核核心 API 增加或减少它。
何时增加它是模块的责任。例如,如果somefs
内核中有一个模块,那么等待的行为是在任何分区挂载时增加该计数器somefs
,并在卸载时减少该计数器。这样somefs
就可以保证在有挂载的分区的情况下不会被删除somefs
。
如果模块使用计数器非零,rmmod
则该模块失败。但rmmod -f
如果强制模块删除被编译到内核中,则不会。
因此,重要的事情是:
- 计数器的递增和递减是模块的责任,其背后没有复杂的通用参考跟踪。
- 在许多情况下,它可以正常工作,但并非总是如此。例如,某些脏模块,例如
ipv6
以这种方式工作,它将计数器增加到 1insmod
并且永远不会减少。因此,如果你编译ipv6
为模块,你将永远无法做到rmmod
这一点。某些显卡驱动程序以类似的方式工作,因为缺少将其取消初始化的例程。没有这样的模块可以使其开发人员感到自豪。 - 如果因此无法删除模块,则没有通用方法可以查明模块到底使用了什么。
答案2
poe_isr 3046 4 - Live 0xc37e1000 (O)
其中第 3 列表示有 4 个依赖模块/进程。因此rmmod
不会起作用。第四列指示这些是模块还是非模块。 '-' 表示 4 个是非模块。在上面的例子中,poe_isr依赖于4个非模块。