Использование kmalloc в драйвере устройства

В задании, которое у меня есть, я должен создать драйвер устройства для колоды карт. Однако у меня возникли проблемы с использованием kmalloc на массиве структур. Массив строит колоду и имеет размер 52. У меня пока есть следующее (очевидно, оно неполное):

#include <linux/slab.h>         // kmalloc()
#include <linux/fs.h>           // everything
#include <linux/errno.h>        // error codes
#include <linux/types.h>        // ssize_t
#include <linux/fcntl.h>        // O_ACCMODE
#include <linux/miscdevice.h>
#include <asm/uaccess.h>        // copy_to_user copy_from_user

MODULE_LICENSE("GPL"); 

struct card{
   char num;
   char suit;
}; 

struct card deck[52];

static int __init_deck(void){
    int i;
    int returnValue;
    for(i = 0; i < 52; i++){
        deck[i] = kmalloc(sizeof(struct card), GFP_KERNEL); // error here
        if(!deck[i]){ // error here
            printk(KERN_ERR "Unable to allocate memory.");
        }
    }

    return returnValue;
}

У меня есть ошибки, когда я пытаюсь и пытаюсь скомпилировать, используя make-файл error: incompatible types when assigning to type ‘struct card’ from type ‘void *’ для первого и error: wrong type argument to unary exclamation mark для второго. Я предполагаю, что второй пропадет после исправления kmalloc, но я не знаю, что не так и как это исправить.

1 ответ

Обратите внимание на свои ошибки. Вы пытаетесь назначить тип указателя на struct card, Вы, кажется, хотели массив card*,

struct card *deck[52];

В противном случае вам вообще не нужно динамическое размещение; у тебя уже есть 52 действительный card объекты.

Другие вопросы по тегам