迭代内核模块中的所有模块

时间:2017-04-22 10:39:28

标签: c linux-kernel kernel-module

我对内核中可用的变量感到有点困惑。我将如何迭代我自己的内核模块中的所有模块?我发现内核代码中使用了modules。我能否按照

的方式做点什么
struct module *mod;

list_for_each_entry(mod, &modules, list) {
  printk(KERN_INFO "%s\n", mod->name);
}

2 个答案:

答案 0 :(得分:0)

对于模块列表的迭代,有没有直接的方式

模块列表的头部是modules变量,kernel/module.c中定义了静态,因此该文件以外的代码无法访问它。

如果调试目的需要模块名称列表,您可以使用WARN_ON()宏或类似名称:

WARN_ON(0);

这将打印有关警告和一些其他信息的消息,其中包含模块列表。

答案 1 :(得分:-1)

找到解决此问题的解决方法。

struct list_head *list;
struct module *mod;
struct module *mine = find_module("YOUR_MODULE_NAME");

list_for_each(list, &mine->list){
  mod = list_entry(list, struct module, list);
  do_stuff_with_mod(mod);
}

这使用kernel/module中的方法find_module。您将需要指定您的模块在GPL下获得许可,否则将无法加载(虽然编译将会成功)。

声明

我不认为这种方法是最好的方法,但它足以完成简单的任务,如printk