首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >内核链表内核Oop

内核链表内核Oop
EN

Stack Overflow用户
提问于 2013-10-29 15:48:39
回答 2查看 598关注 0票数 1

我试图在内核级别上使用linux/list.h创建一个链接列表。我的代码会编译,但是当我试图将多个节点添加到链接列表中时,它会导致内核Oops。下面是我的内核级代码:

代码语言:javascript
复制
    //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;

我的用户程序看起来是:

代码语言:javascript
复制
long hello_syscall(void) {
char *arg = "Hello";
return syscall(351, "Hello", sizeof(arg));
}

所有这些都会编译,但是当我多次尝试运行userland程序时,它会显示出我有一个内核oops。我已经创建了操作系统在发生错误时给我的错误消息的要点:https://gist.github.com/anonymous/7217210

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2013-10-30 00:52:44

代码语言:javascript
复制
struct Node first = {ptr, LIST_HEAD_INIT(first.list)};

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

票数 1
EN

Stack Overflow用户

发布于 2015-10-19 05:46:49

Linux内核主要是用C语言编写的。您可以使用这种形状的结构:

代码语言:javascript
复制
struct _Node
 {

    char *data;
    struct NODE* list;

}NODE,PNODE*;
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/19663054

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档