【问题标题】:Kernel Linked List Kernel Oops内核链表内核糟糕
【发布时间】:2013-11-08 21:26:23
【问题描述】:

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

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

【问题讨论】:

  • 尝试使用 INIT_LIST_HEAD(list)。查看内核源码中 struct list_head 是如何使用的。
  • 同时检查 kmalloc 的错误返回。如果失败,你的下一行代码就会崩溃。

标签: c linux-kernel operating-system linked-list kernel


【解决方案1】:
struct Node first = {ptr, LIST_HEAD_INIT(first.list)};

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

【讨论】:

    【解决方案2】:

    Linux 内核大部分是用 C 语言编写的。 你可以使用这种形状的结构:

    struct _Node
     {
    
        char *data;
        struct NODE* list;
    
    }NODE,PNODE*;
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2012-10-29
      • 1970-01-01
      • 1970-01-01
      • 2020-04-28
      • 1970-01-01
      • 1970-01-01
      • 2014-11-18
      相关资源
      最近更新 更多