我正在尝试使用内核级别的linux / list.h创建链接列表。我的代码编译但是当我尝试将多个节点添加到链表中时,它会导致内核糟糕。这是我的内核级代码:
//global defs
struct Node {
char *data;
struct list_head list;
};
LIST_HEAD(mylinkedlist);
DEFINE_MUTEX(mut);
asmlinkage long write(const void __user *data, long len){
//create new space in memory enough to fit data
void *ptr = kmalloc(len, GFP_KERNEL);
//create the user space pointer to kernel space pointer
int verif = copy_from_user(ptr, data, len);
if(verif != 0){
return -EFAULT;
}
struct Node first = {ptr, LIST_HEAD_INIT(first.list)};
//wait for mutex to be available
mutex_lock_interruptible(&mut);
list_add_tail(&first.list, &mylinkedlist);
//release the mutex
mutex_unlock(&mut);
return 0;
我的用户程序如下:
long hello_syscall(void) {
char *arg = "Hello";
return syscall(351, "Hello", sizeof(arg));
}
这一切都编译但是当我尝试不止一次运行userland程序时它会显示我有一个内核oops。我已经创建了操作系统在发生时给出的错误消息的要点:https://gist.github.com/anonymous/7217210
答案 0 :(得分:1)
struct Node first = {ptr, LIST_HEAD_INIT(first.list)};
在堆栈上分配first
,当函数离开时它会消失。 mylinkedlist
将指向垃圾,因此下一个列表操作将崩溃。
答案 1 :(得分:0)
Linux内核大多是用C语言编写的。 你可以使用这种形状的结构:
struct _Node
{
char *data;
struct NODE* list;
}NODE,PNODE*;