1

嗨,我正在做一个关于编译内核的项目。但是,我面临一个错误,上面写着

fork.c: In function `do_fork':
fork.c:764: request for member `list' in something not a structure or union

简要说明:我使用的是在内核中为每种类型的结构定义的现成链表。(所以我有自己的数据结构)此外,我为我的链表使用了预定义的函数,如添加、遍历、删除节点但由于这个错误,我没有任何进展。在这里你可以看到包含我的数据结构的头文件。

/* project_header.h> */
#ifndef __LINUX_PROJECT_HEADER_H

#define __LINUX_PROJECT_HEADER_H

#include <linux/linkage.h>
#include <linux/vmalloc.h>
#include <linux/list.h>

#endif

typedef struct node{

        struct list_head list; /* kernel's list structure */
        long int sample_pid;

}NODE;

此头文件位于位置include/linux目录中。

这是我将在新内核中使用的系统调用。我projectList在全球范围内定义了在其他文件中使用它。

#include <linux/sample.h>
#include <linux/project_header.h>

NODE projectList;

asmlinkage void sys_sample(void){

        NODE* temp;

                list_for_each_entry(temp, &projectList.list, list){

                        printk(KERN_INFO "TEMP->PID = %ld\n", temp->project_pid);
                }

        return;
}

我尝试fork.ckernel/目录中使用它,在这里您可以看到我添加到的示例代码fork.c。另一方面,我调用projectListwith 语句extern projectList来引用在sample.c

      /* do_fork.c */
      /* do_fork() function */
      #include <linux/project_header.h>
      #include <linux/sample.h>

      extern projectList; // Call variable projectList

      .
      .
      .

      do_fork(parameters..){

     struct task_struct* p;
.
.

     line 759-->NODE* newNode;

     line 760-->newNode = kmalloc(sizeof(*newNode), GFP_KERNEL);

     line 761-->newNode->sample_pid = p->pid;

     line 762-->INIT_LIST_HEAD(&newNode->list);

     /* add the new node to mylist */

     line 764--> list_add_tail(&(newNode->list), &(projectList.list));

     .
     .
     .
    }

我希望我对你很清楚,如果你能帮助我,我会很高兴,无论如何谢谢

4

1 回答 1

1
extern projectList; // Call variable projectList

您忘记在projectList此处声明的类型,因此如果编译器处于 C89 模式,它会应用“隐式int”规则。因此,你projectList是一个intin fork.c,而不是一个structorunion有成员。

于 2013-01-02T01:59:47.243 回答