1

カーネル レベルで 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

4

2 に答える 2

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

スタックに割り当てられfirst、関数が終了すると消えます。 mylinkedlistしたがって、ガベージを指し、次のリスト操作がクラッシュします。

于 2013-10-30T00:52:44.937 に答える