我对内核中可用的变量感到有点困惑。我该如何迭代我自己的内核模块中的所有模块呢?我发现内核代码中使用了modules
。我可以这样做吗?
struct module *mod;
list_for_each_entry(mod, &modules, list) {
printk(KERN_INFO "%s\n", mod->name);
}
发布于 2017-04-29 04:28:08
没有用于迭代模块列表的直接方法。
模块列表的头部是在kernel/module.c中静态定义的modules
变量,因此该文件之外的代码无法访问它。
如果出于调试目的需要模块名称列表,您可以使用WARN_ON()宏或类似的:
WARN_ON(0);
这将打印有关警告的消息和一些附加信息,其中将包含模块列表。
发布于 2017-04-24 01:10:05
找到了解决此问题的方法。
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
这样的简单任务
https://stackoverflow.com/questions/43558217
复制相似问题