检查 Linux 内核模块是否在运行

3
我编写了一个内核模块,创建了/proc/中的一个条目并执行一些其他任务。我想修改现有的内核模块,检查我的模块是否正在运行,并根据情况执行某些语句(或在其未运行时执行其他语句)。
有什么建议吗?

1
看一下lsmod的实现方式(只是格式化/proc/modules的内容,如果我没记错),还是解析它的输出? - ChristopheD
@ChristopheD:你肯定不想在内核中运行lsmod... - sarnold
@sarnold:是的,非常好的观点;-) - ChristopheD
1个回答

4

kernel/module.c 提供了一个函数,它很可能可以完成你所需要的功能;首先你需要锁定 module_mutex,然后使用你的模块名称调用 find_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);

1
我有一个类似的疑问。@sarnold所说的方法是有效的。但是假设我们正在谈论一个自定义内核,并且该程序被配置为内置而不是作为模块进行构建,那么其他模块如何知道呢?是否存在通用解决方案?一种询问“IF(xxx是内置还是作为模块运行)THEN DO this ELSE DO this”的方法? - marcocamejo
1
如果你的意思是在 make config 中选择了 Y 而不是 M,我真的希望 find_module() 接口仍然能够正常工作。也许你更适合使用 #if CONFIG_FOO 来决定内置或非内置 CONFIG_FOO 变量吧…… - sarnold
是的,我的意思是在make config中选择Y而不是M。如果选择了Y,我将尝试使用find_module(),希望它能起作用。我不太明白#if CONFIG_FOO这部分,请您再解释一下好吗?谢谢。 - marcocamejo
1
仅以一个例子为例,drivers/infiniband/core/addr.c 文件包含以下代码行: #if defined(CONFIG_IPV6) || defined(CONFIG_IPV6_MODULE) -- 如果你修改内核源代码以添加你的内置代码,你可以执行相同类型的检查。 - sarnold
哦,感谢@marcocamejo的评论和@sarnold的回答。使用#if defined()可以覆盖两种情况(配置为Y或M)吗? - jeanc
显示剩余2条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接