J'essaie de passer une structure de l'espace utilisateur vers l'espace noyau. J'avais essayé pendant de nombreuses heures et ça ne marche pas. Voici ce que j'ai fait jusqu'à présent.Passage de la structure au pilote de périphérique via IOCTL
int device_ioctl(struct inode *inode, struct file *filep, unsigned int cmd, unsigned long arg){
int ret, SIZE;
switch(cmd){
case PASS_STRUCT_ARRAY_SIZE:
SIZE = (int *)arg;
if(ret < 0){
printk("Error in PASS_STRUCT_ARRAY_SIZE\n");
return -1;
}
printk("Struct Array Size : %d\n",SIZE);
break;
case PASS_STRUCT:
struct mesg{
int pIDs[SIZE];
int niceVal;
};
struct mesg data;
ret = copy_from_user(&data, arg, sizeof(*data));
if(ret < 0){
printk("PASS_STRUCT\n");
return -1;
}
printk("Message PASS_STRUCT : %d\n",data.niceVal);
break;
default :
return -ENOTTY;
}
return 0;
}
J'ai du mal à définir la structure. Quelle est la bonne façon de le définir? Je veux avoir des pID int [TAILLE]. Est-ce que int * pID le fera (dans l'espace utilisateur, il est défini comme pIDs [SIZE])?
EDIT:
Avec le changement ci-dessus je reçois cette erreur? erreur: expression attendue avant 'struct' des idées?
en ce qui concerne le cas PASS_STRUCT, vous devez définir "données" comme struct, pas un pointeur vers struct, puis passer correctement la taille à copy_from_user. Votre problème est plus probable C. imho vous devriez être plus expérimenté avec C avant de creuser le noyau. – sardok
Comment pensez-vous que je devrais définir cette fonction, #define PASS_STRUCT _IOW (MY_MAGIC, 2, struct mesg *)? – user340
J'ai défini les données comme struct, (struct mesg data;). Mais donne l'erreur d'erreur: la taille de stockage de «données» n'est pas connue .. toutes les idées? – user340