c - 将系统调用添加到 Linux 内核



我是使用内核的新手。 我想在我的内核中添加一个链表,我尝试像这样修复它 链接 : Linux 内核编程 – 链表

这是我添加到 sys.c 的代码:

系统调用防御:

SYSCALL_DEFINE1(init_process_list,pid_t,ppid)
{
LIST_HEAD(processList);
struct scallNode* newNode;
newNode = kmalloc(sizeof(*newNode), GFP_KERNEL);
newNode->ID = ppid;
INIT_LIST_HEAD(&newNode -> list);
list_add_tail(&newNode -> list , &processList.list);
printk(KERN_INFO "INIT PROCESS UID: %un", ppid);
return 0; 
}

和我的链表结构:

struct scallNode{
int ID;
struct file_struct ffs;
struct task_struct ts;
struct list_head list;
};
struct scallNode processList;

当我编译内核时,我看到了这个错误:

error: ‘struct list_head’ has no member named ‘list’   list_add_tail(&newNode -> list , &processList.list);

感谢您的回复。

该错误消失了,但另一个仍然存在。

kernel/sys.c:2136:24: error: field ‘fs’ has incomplete type      struct file_struct fs;

再次感谢您的回复。

>list_add_tail函数是

void list_add_tail(struct list_head *new, struct list_head *head);

第二个参数应该是指向struct list_head的指针,所以只需像这样使用:

list_add_tail(&newNode -> list , &processList);

我从来没有做过任何内核编程。但据我所知,下面的内存分配是不正确的:-

newNode = kmalloc(sizeof(*newNode), GFP_KERNEL);

我认为它应该是这样的:-

newNode = (struct scallNode *)kmalloc(sizeof(struct scallNode), GFP_KERNEL);

终于找到了答案。

list_add_tail(&newNode -> list , &processList.list);&processList大多数是使用而不是&processList.list

list_add_tail找到进程列表本身的列表。

相关内容

  • 没有找到相关文章

最新更新