簡體   English   中英

內核鏈接列表內核糟糕

[英]Kernel Linked List Kernel Oops

我正在嘗試在內核級別使用linux / list.h創建一個鏈表。 我的代碼可以編譯,但是當我嘗試向鏈接列表中添加多個Node時,會導致內核異常。 這是我的內核級別代碼:

    //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;

我的userland程序如下所示:

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將指向垃圾,因此下一個列表操作將崩潰。

Linux內核主要是用C語言編寫的。 您可以使用以下形狀的結構:

struct _Node
 {

    char *data;
    struct NODE* list;

}NODE,PNODE*;

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM