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 :

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
 };
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
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
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
 
mmap(NULL, 4, 0, 0, fd, 0)
mmap(NULL, 4, PROT_READ|PROT_WRITE, 0, fd, 0)
Les erreurs persistent et le programme ne rentre toujours pas dans gntdev_mmap2.
J'ai testé la validité du descripeur avec la fonction suivante :

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;
}
Le descripteur est valide.
Quelqu'un a-t'il une idée sur l'erreur qui se produit dans ce programme svp ?

Merci !!!