检查Linux内核模块是否正在运行
我编写了一个内核模块,它在/proc/中创建一个条目并执行一些其他任务。 我想修改一个现有的内核模块,以检查我的模块是否正在运行,并根据它执行一些语句(或者在它不运行的情况下执行其他语句)检查Linux内核模块是否正在运行,linux,kernel,kernel-module,Linux,Kernel,Kernel Module,我编写了一个内核模块,它在/proc/中创建一个条目并执行一些其他任务。 我想修改一个现有的内核模块,以检查我的模块是否正在运行,并根据它执行一些语句(或者在它不运行的情况下执行其他语句) 有什么建议吗?内核/module.c提供了一个可能满足您需要的函数;首先需要锁定module\u互斥锁,然后使用模块名称调用find\u module()。结果将是指向描述命名模块的struct module的指针,如果未加载模块,则为NULL: /* Search for module by name: m
有什么建议吗?
内核/module.c
提供了一个可能满足您需要的函数;首先需要锁定module\u互斥锁
,然后使用模块名称调用find\u module()
。结果将是指向描述命名模块的struct module
的指针,如果未加载模块,则为NULL
:
/* Search for module by name: must hold module_mutex. */
struct module *find_module(const char *name)
{
struct module *mod;
list_for_each_entry(mod, &modules, list) {
if (strcmp(mod->name, name) == 0)
return mod;
}
return NULL;
}
EXPORT_SYMBOL_GPL(find_module);
看看
lsmod
是如何实现的(只是格式化/proc/modules iirc的内容)或解析它的输出?@ChristopheD:你肯定不想从内核中运行lsmod
。@sarnold:是的,非常好;-)我也有类似的疑问。@sarnold所说的是有效的。但是假设我们讨论的是一个定制内核,并且程序被配置为内置的而不是模块,那么另一个模块怎么会知道呢?有没有通用的解决方案?问“如果(xxx是内置的或作为一个模块运行),那么就这样做,否则就这样做”@marocamejo:如果你的意思是你在make config
中选择了Y
而不是M
,我真的希望find_module()
界面仍然有效。也许您更适合使用#if CONFIG_FOO
来决定内置是否内置的CONFIG_FOO
变量……是的,我的意思是在make CONFIG中选择Y而不是M。我将尝试查找_module(),以防它被Y选中,希望它能正常工作。我没有得到#if CONFIG#u FOO#的角色,你能再给我解释一下吗?感谢大家举一个例子,drivers/infiniband/core/addr.c
有以下几行:#如果定义了(配置IPV6)|定义了(配置IPV6模块)
——如果您修改内核源代码以添加内置代码,您可以进行同样的检查。哦,感谢您对@marocamejo的评论和对@sarnold的回答。使用#if defined()
可以覆盖这两种情况(配置为Y或M)?