5

Linux のドライバーについて詳しく学ぼうとして、単純な char ドライバーを作成しようとしています。

ドライバーのアイデアは、各ノードに単一の文字と次のノードへのポインターを保持するリンクされたリストを持つことです。kmem_cache を使用してこのリンク リストを作成するつもりでした。必要に応じて、個々のノードに一度に 1 つのオブジェクトを割り当てるのが簡単だと考えたからです。

これが私が問題を抱えている関連コードです。私はこのことを機能させようとしているだけなので、きれいではありません。

struct kmem_cache *memCache;

typedef struct {
    char data;
    struct node* next;
} node;

node *head = NULL;

static ssize_t hello_write(struct file *file, const char *buf, size_t count, loff_t *ppos)
{
    int i;
    accesscount++;

    for(i = 0; i < count; i++)
    {
        node *finder;
        node *temp;

        finder = head;

        if(finder == NULL)
        {
            finder = kmem_cache_alloc(memCache, GFP_KERNEL);
            //memset(finder, 0, sizeof(node)); 

            if(!finder)
                return -ENOMEM;

            finder->next = NULL;

            //!!!NULL DEREFERENCE HERE!!!
            copy_from_user(finder->data, buf+i, 1);

            head = finder;
        }
        else
        {
            while(finder->next != NULL)
                finder = finder->next;

            temp = kmem_cache_alloc(memCache, GFP_KERNEL);
            //memset(temp, 0, sizeof(node)); 

            if(!temp)
                return -ENOMEM;

            temp->next = NULL;

            copy_from_user(temp->data, buf+i, 1);

            finder->next = temp;
        }

        charsStored++;  
    }

    return count;
}

static int __init hello_init(void)
{
    memCache = kmem_cache_create("hello1", sizeof(node), 0, 0, NULL);
}

私のコメントからわかるように、copy_from_user() を呼び出して char 変数をノードに渡すと、null 逆参照が発生します。ノードにメモリを割り当てたので、もうnullにすべきではないと思いました。また、代わりに char を char* に設定しようとしましたが、異なる結果が得られましたが、それでも正しく機能しませんでした。

私の問題は、メモリの割り当て方法またはポインターの作成方法のどこかにあることはわかっていますが、本当にここで立ち往生しています。誰かがここで何が間違っているかについて何らかの考えを持っていることを願っています.

4

1 に答える 1

2

値ではなく、finder->data のアドレスを copy_from_user に渡します。

于 2012-11-09T17:18:32.447 に答える