Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/linux/28.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Linux 列出内核模块_Linux_Module_Linux Kernel - Fatal编程技术网

Linux 列出内核模块

Linux 列出内核模块,linux,module,linux-kernel,Linux,Module,Linux Kernel,我编写了内核模块,其中列出了系统中加载的所有模块。但当模块列表结束时,循环就开始工作了。我尽了一切努力来阻止这个循环,但最后我做不到。我添加了函数printk,它可以写入模块名(当尝试写入不存在的模块名时,它会生成内核)。有人能帮我吗?我需要模块列表以继续编写此模块。资料来源: #include <linux/module.h> #include <linux/kernel.h> #include <linux/init.h> #include <lin

我编写了内核模块,其中列出了系统中加载的所有模块。但当模块列表结束时,循环就开始工作了。我尽了一切努力来阻止这个循环,但最后我做不到。我添加了函数printk,它可以写入模块名(当尝试写入不存在的模块名时,它会生成内核)。有人能帮我吗?我需要模块列表以继续编写此模块。资料来源:

#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");
#包括
#包括
#包括
#包括
结构列表\头模块\列表;
结构列表_head*m;
结构模块*ops_模块;
int-agh=0;
char*x=(char)0;
作废列表\单元(作废)
{
模块列表=该模块->列表;
对于(m=(&modules\u list)->next;m!=(&modules\u list);m=m->next){
printk(内核信息“列表迭代%d”,agh);
ops\u mod=列表项(m,结构模块,列表);
如果((m)->next==NULL){
printk(KERN_警告“杂项列表:空指针”);
返回;
}
printk(KERN_INFO“在迭代%d之后”,agh);
printk(KERN_INFO“打印名称%d”,agh);
agh++;
if(&ops_mod->mkobj.kobj.name==NULL)
返回;
否则{
printk(“地址:%d”,操作模块);
printk(“杂项:确定%s”,操作模块->mkobj.kobj.name);
}
//ops_mod=NULL;
}
}
int init_模块(void)
{
列表_模块();
返回0;
}
void cleanup_模块(void){}
模块许可证(“GPL”);

通常,您会按住
模块\u互斥体,并使用列表帮助器,如下所示:

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
中执行此操作的,因此我认为问题可能是您的模块尚未设置。

通常您会持有
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\u模块内执行此操作的,因此我认为问题可能是您的模块尚未设置。

循环结束条件(
m!=(&modules\u list)
)有问题。这是传单吗?我不知道。它的全局模块列表迭代列表的正确方法是使用
list\u for_each()
list\u for_each\u entry()
或类似的宏。但所有这些宏都需要列表的开头,而您无权访问它(请参见问题)
此模块->列表
是列表的一个元素,而不是头。循环结束条件(
m!=(&modules\u list)
)有问题。这是传单吗?我不知道。它的全局模块列表迭代列表的正确方法是使用
list\u for_each()
list\u for_each\u entry()
或类似的宏。但所有这些宏都需要列表的开头,而您无权访问它(请参见问题)
这个模块->列表
是列表的一个元素,不是头。哦,但是@Tsyvarev是对的,缺陷实际上是不可能从当前模块开始遍历列表。哦,但是@Tsyvarev是对的,缺陷实际上是不可能从当前模块开始遍历列表。