Использование 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
объекты.