Forum Programmation.c Driver d'acces mémoire et mode user

Posté par  .
Étiquettes : aucune
1
3
nov.
2009
Bonjour,


dans le cadre d'un projet j'essaye d'optimiser une application qui accède à une mémoire via un driver sous linux 2.4.26 (distribution Arabella pour une carte embarquée).

- Le driver est un développement spécifique qui lit et écrit dans une RAM avec les fonctions read/write. Il est chargé au démarrage avec un 'insmod'.

- L'applicatif transmet à répétition des blocs de données vers le driver avec les fonctions pread / pwrite.

Le problème est que ces appels à répétition du driver consomment beaucoup de temps et ralentissent l'application.

Existe-t-il un moyen simple d'accéder à la mémoire RAM directement depuis l'application, donc en mode user ? Idéalement j'aimerais supprimer complètement le driver.

Merci pour votre aide.
  • # C'est possible mais...

    Posté par  . Évalué à 3.

    ... ce n'est pas une bonne idée (*).

    Ce qu'il faut c'est essayer de savoir d'où vient la lenteur : de la mémoire ou du pilote.
    - Si c'est le pilote alors c'est lui qu'il faut corriger, ça profitera à toutes les applications qui l'utilisent.
    - Si c'est la mémoire, il faut essayer de minimiser le nombre d'accès. Une bon moyen est de créer un "shadow buffer", c'est à dire une image de ta ram lente en mémoire standard et de l'utiliser pour les lectures. Évidemment, si un périphérique peut modifier la RAM, il faut gérer l'invalidation du shadow buffer. Ce genre de choses a plus sa place dans le pilote que dans ton application.

    Dans tout les cas, tu as intérêt à créer des applications de tests qui te permettent de mesurer les vitesses de lectures et d'écritures séquentielles et aléatoires. Ça permet de savoir si les modifications que tu fais vont dans le bon sens ou non.

    Un dernier truc : Si ta RAM a un signal READY/BUSY, vérifie son câblage. Je me suis fait avoir une fois avec de la flash.

    (* : Si tu tiens vraiment à le faire, regarde du coté de /dev/mem)
    • [^] # Re: C'est possible mais...

      Posté par  . Évalué à 1.

      Bonjour et déjà merci pour ta réponse.

      Pour vérifier l'impact du driver j'ai fait une application qui accède plusieurs dizaines de fois au driver.

      Et le driver a été réduit au strict minimum : les fonctions read et write retournent immédiatement (on ne fait plus d'accès à la mémoire).

      Le résultat est le même, le temps d'accès varie entre 20 et 40ms avec des pointes à plus de 100ms.
      • [^] # Re: C'est possible mais...

        Posté par  . Évalué à 3.

        20ms pour une lecture ou une écriture !? Il y a comme un bug là ! Tu peux peut-être essayer tes tests en lecture sur /dev/zero et en écriture sur /dev/null.

        Si tu as les mêmes temps alors c'est ta plateforme qui a des problèmes. Il faut vérifier la configuration du noyau, la gestion des caches d'instructions et de données, les tlb...

        Si c'est plus rapide, alors le défaut est dans le pilote.

        J'y pense maintenant : tu peux éviter les appels à read et write si tu implémentes mmap dans ton pilote et que tu t'en sers dans ton application.

Suivre le flux des commentaires

Note : les commentaires appartiennent à celles et ceux qui les ont postés. Nous n’en sommes pas responsables.