Bonjour !!
Je suis en train d'essayer d'utiliser un module de Xen, GNTDEV, qui fournit plusieurs commandes ioctl et une implémentation de la fonction mmap. L'implémentation de cette fonction au sein du module est bien indiquée dans la structure file_operations :
L'emploi des commandes ioctl du module fonctionne correctement, mais l'appel à la fonction mmap échoue systématiquement :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8 static const struct file_operations gntdev_fops = { .owner = THIS_MODULE, .open = gntdev_open, .release = gntdev_release, .mmap = gntdev_mmap2, .unlocked_ioctl = gntdev_ioctl };
On voit ci-dessus que la fonction a échoué en renvoyant l'adresse -1 et en mettant errno à EINVAL. Mon premier réflexe a été de regarder le fonctionnement de gntdev_mmap2 pour trouver quel argument n'était pas conforme à l'emploi qui en est fait dans la fonction. J'ai donc mis des printk(__LINE__) dans la fonction pour observer rapidement à quelle ligne se posait le problème. Et là, incompréhension, le programme ne rentre jamais dans la fonction. Comme un ensemble de traitement est effectué avant l'appel à la fonction mmap elle-même, j'ai essayé de modifier les arguments passés à mmap pour observer ce qu'il se passe lorsque l'on simplifie l'appel :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12 if((status = mmap(NULL, page_num * PAGE_SIZE, PROT_READ|PROT_WRITE, VM_SHARED, fd, map.index)) == (void *)-1){ printf("Status : %p %d\n", status, status); perror("mmap :"); close(fd); return -1; } printf("Adress : %p\n", status); desc_t * infos = (desc_t *)status; > Status : 0xffffffffffffffff -1 > mmap :: Invalid argument
Les erreurs persistent et le programme ne rentre toujours pas dans gntdev_mmap2.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3 mmap(NULL, 4, 0, 0, fd, 0) mmap(NULL, 4, PROT_READ|PROT_WRITE, 0, fd, 0)
J'ai testé la validité du descripeur avec la fonction suivante :
Le descripteur est valide.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5 int fd_is_valid(int fd) { return fcntl(fd, F_GETFD) != -1 || errno != EBADF; }
Quelqu'un a-t'il une idée sur l'erreur qui se produit dans ce programme svp ?
Merci !!!
Partager