gpt4 book ai didi

c - 内核链表内核 Oops

转载 作者:太空宇宙 更新时间:2023-11-04 03:52:29 25 4
gpt4 key购买 nike

我正在尝试在内核级别使用 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

最佳答案

struct Node first = {ptr, LIST_HEAD_INIT(first.list)};

在堆栈上分配 first 并在函数离开时消失。 mylinkedlist 将指向垃圾,因此下一个列表操作将崩溃。

关于c - 内核链表内核 Oops,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19663054/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com