2013-10-29 94 views
1

我想在內核級別使用linux/list.h創建鏈接列表。我的代碼編譯,但當我嘗試添加多個節點到鏈接列表中時,它會導致內核糟糕。這是我的內核級代碼:內核鏈接列表內核Oops

//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。我創建了錯誤消息的要旨發生時的OS給我:https://gist.github.com/anonymous/7217210

+0

嘗試使用INIT_LIST_HEAD(list)。查看內核源代碼如何使用struct list_head。 –

+0

同時檢查kmalloc返回的錯誤。如果失敗,您的下一行代碼將崩潰。 – z242

回答

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

分配first堆棧上的功能留給當它消失。 mylinkedlist將指向垃圾,因此下一個列表操作將崩潰。

0

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

struct _Node 
{ 

    char *data; 
    struct NODE* list; 

}NODE,PNODE*;