我编写了内核模块,列出了系统中加载的所有模块。但是什么时候是模块的结束列表,循环正在工作。我尝试了一切来阻止这个循环,但最后我无法做到这一点。我添加了写入模块名称的函数printk(当尝试写入不存在的名称模块时,它使内核oops)。谁能帮我?我需要模块列表继续编写这个模块。来源:
#include <linux/module.h>
#include <linux/kernel.h>
#include <linux/init.h>
#include <linux/list.h>
struct list_head modules_list;
struct list_head *m;
struct module *ops_mod;
int agh = 0;
char *x = (char) 0;
void list_module(void)
{
modules_list = THIS_MODULE->list;
for(m = (&modules_list)->next; m != (&modules_list); m = m->next) {
printk(KERN_INFO "List iteration %d", agh);
ops_mod = list_entry(m, struct module, list);
if ((m)->next == NULL) {
printk(KERN_WARNING "MISC list: NULL pointer");
return;
}
printk(KERN_INFO "after iteration %d", agh);
printk(KERN_INFO "print name %d", agh);
agh++;
if (&ops_mod->mkobj.kobj.name == NULL)
return;
else {
printk("Adress: %d", ops_mod);
printk("MISC: ok %s", ops_mod->mkobj.kobj.name);
}
//ops_mod = NULL;
}
}
int init_module(void)
{
list_module();
return 0;
}
void cleanup_module(void){}
MODULE_LICENSE("GPL");
答案 0 :(得分:0)
通常你会持有module_mutex
,并使用列表助手,如下所示:
struct module *mod;
mutex_lock(&module_mutex);
list_for_each_entry(mod, &THIS_MODULE->list, list)
printk(KERN_INFO "%s", mod->name);
mutex_unlock(&module_mutex);
但是你是在init_module
内执行此操作,所以我认为问题可能是您的模块尚未设置。