module_refcount用来显示该模块被其他模块引用的计数.
使用的实例如下:
static int kdb_lsmod(int argc, const char **argv)
{
struct module *mod;
if (argc != 0)
return KDB_ARGCOUNT;
kdb_printf("Module Size modstruct Used by\n");
list_for_each_entry(mod, kdb_modules, list) {
if (mod->state == MODULE_STATE_UNFORMED)
continue;
kdb_printf("%-20s%8u 0x%p ", mod->name,
mod->core_layout.size, (void *)mod);
#ifdef CONFIG_MODULE_UNLOAD
kdb_printf("%4d ", module_refcount(mod));
#endif
if (mod->state == MODULE_STATE_GOING)
kdb_printf(" (Unloading)");
else if (mod->state == MODULE_STATE_COMING)
kdb_printf(" (Loading)");
else
kdb_printf(" (Live)");
kdb_printf(" 0x%p", mod->core_layout.base);
}
其源码如下:
int module_refcount(struct module *mod)
{
return atomic_read(&mod->refcnt) - MODULE_REF_BASE;
}
这里的MODULE_REF_BASE 定义如下:
#define MODULE_REF_BASE 1
因为模块在被kmodule加载的时候mod->refcnt 会加1,所以这个模块被其他模块真正引用的计数应该减去1
模块API之module_refcount
最新推荐文章于 2024-06-06 09:58:20 发布