カーネル レベルで linux/list.h を使用してリンク リストを作成しようとしています。私のコードはコンパイルされますが、リンクされたリストに複数のノードを追加しようとすると、Kernel 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