OVH Cloud OVH Cloud

mmap, /dev/video et kernel 2.6

11 réponses
Avatar
Thomas Labourdette
Bonjour,

Avec le kernel 2.6.9, mmap échoue systématiquement lorsque le descripteur de
fichier est associé à un périphérique vidéo (bttv) alors que je n'ai aucun
problème sous un kernel 2.4

Soit le code suivant :
#include <sys/types.h>
#include <sys/stat.h>
#include <sys/mman.h>
#include <fcntl.h>
#include <unistd.h>
#include <stdio.h>

int main()
{
  unsigned char *map=NULL;
  int fd=open("/dev/video0",O_RDWR);
  if(fd==-1)
    return -1;
  map=mmap(0,230400,PROT_READ | PROT_WRITE, MAP_SHARED, fd,0);
  if(map==(unsigned char *)-1)
    {
      perror("");
      return -1;
    }
  else
    {
      puts("ok");
      munmap(map,10);
    }
  return 0;
}

sous un kernel 2.4 :
tlabourdette@proto2:~$ ./test_mmap
ok

sous un kernel 2.6 :
tlabourdette@dev1:~$ ./test_mmap
Invalid argument


Une idée ?

Merci d'avance

@+

--
Gilles AIDSOVETAGE (signature aléatoire)
LOI (à la con)
Il est interdit de traverser la rue en marchant sur les mains.
(Hartford, Connecticut)

1 réponse

1 2
Avatar
no_spam
On Wed, 08 Dec 2004 07:11:00 +0100, Thomas Labourdette wrote:

no_spam a écrit le lundi 06 Décembre 2004 17:50 :

On Mon, 06 Dec 2004 17:26:34 +0100, Thomas Labourdette wrote:


Avec le kernel 2.6.9, mmap échoue systématiquement lorsque le descripteur
de fichier est associé à un périphérique vidéo (bttv) alors que je n'ai
aucun problème sous un kernel 2.4


Enlève le PROT_WRITE. Il me parait très douteux que tu puisse écrire
dans le buffer d'acquisition d'un device de capture vidéo.


Bon après les derniers test fait. Avec un noyau 2.4.x, on peut avoir
(PROT_READ | PROT_WRITE) ou juste (PROT_READ) avec un noyau 2.6 il *faut*
avoir (PROT_READ | PROT_WRITE).


Je viens de vérifier le code du kernel. Effectivement, il teste que
PROT_WRITE est bien présent. Le début de la fonction qui gère le mmap
est:

retval = -EINVAL;
if (!(vma->vm_flags & VM_WRITE)) {
dprintk(1,"mmap app bug: PROT_WRITE pleasen");
goto done;
}
if (!(vma->vm_flags & VM_SHARED)) {
dprintk(1,"mmap app bug: MAP_SHARED pleasen");
goto done;
}
[...]
Le code de test que j'avais posté ne fonctionnait pas à cause de la taille
de la mémoire demandé (et sur lequel j'avais mis d'une façon automatique
PROT_WRITE).


OK



1 2