将系统调用添加到 linux 内核
Add syscalls to linux kernel
我是使用内核的新手。
我想向我的内核添加一个 linked 列表,我尝试像这样修复它 link : Linux Kernel Programming–Linked List
这是我添加到 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: %u\n", ppid);
return 0;
}
和我的 linked 列表的结构:
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;
再次感谢您的回复。
我从来没有做过任何内核编程。但据我所知,内存分配不正确:-
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 查找 processList 本身的列表。
list_add_tail
函数是
void list_add_tail(struct list_head *new, struct list_head *head);
第二个参数应该是一个指向 struct list_head
的指针,所以就像这样使用:
list_add_tail(&newNode -> list , &processList);
我是使用内核的新手。 我想向我的内核添加一个 linked 列表,我尝试像这样修复它 link : Linux Kernel Programming–Linked List
这是我添加到 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: %u\n", ppid);
return 0;
}
和我的 linked 列表的结构:
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;
再次感谢您的回复。
我从来没有做过任何内核编程。但据我所知,内存分配不正确:-
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 查找 processList 本身的列表。
list_add_tail
函数是
void list_add_tail(struct list_head *new, struct list_head *head);
第二个参数应该是一个指向 struct list_head
的指针,所以就像这样使用:
list_add_tail(&newNode -> list , &processList);