我想在內核級別使用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
嘗試使用INIT_LIST_HEAD(list)。查看內核源代碼如何使用struct list_head。 –
同時檢查kmalloc返回的錯誤。如果失敗,您的下一行代碼將崩潰。 – z242