模块的多个实例

模块的多个实例

我曾经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个非模块。

相关内容