2012-05-16 94 views
3

我编写了一个内核模块,它在/ proc /中创建一个条目并执行一些其他任务。 我想修改一个现有的内核模块来检查我的模块是否在运行,并根据它执行一些语句(或者在没有运行时执行其他语句)检查Linux内核模块是否正在运行

有关如何执行此操作的任何建议?

+0

看一看lsmod'是如何实现的'(只是格式化/ proc中的内容/模块iirc)或解析它的输出? – ChristopheD

+0

@ChristopheD:你当然不想在内核中运行lsmod ... – sarnold

+0

@sarnold:是的,非常好的点;-) – ChristopheD

回答

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); 
+0

这是有效的。谢谢 – jeanc

+1

我有类似的疑问。 @sarnold说过的工作。但假设我们正在讨论一个定制的内核,并且该程序被配置为内置模块而不是模块,那么其他模块怎么知道呢?可以有一个通用的解决方案吗?一种方法来问“IF(xxx是内置的还是作为一个模块运行)然后做这个ELSE做这个”? – marcocamejo

+1

@marcocamejo:如果你的意思是你在'make config'中选择了'Y'而不是'M',我真的希望'find_module()'接口_still_可以工作。也许你会更适合'#if CONFIG_FOO',因为无论你用什么'CONFIG_FOO'变量来决定内置是否是内置的... – sarnold