我对内核中可用的变量感到有点困惑。我将如何迭代我自己的内核模块中的所有模块?我发现内核代码中使用了modules
。我能否按照
struct module *mod;
list_for_each_entry(mod, &modules, list) {
printk(KERN_INFO "%s\n", mod->name);
}
答案 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