Pilotes orientés mémoire
Concept des pilotes orientés mémoire (uio-driver)
Le développement de pilotes sous Linux est relativement complexe et nécessite de bonnes connaissances du noyau
Il souffre également de beaucoup de restrictions
Les pilotes orientés mémoire permettent de mapper dans l’espace virtuel du processus d’application les registres et zones mémoire nécessaires au pilotage du périphérique
- Ce mapping est réalisé par l’appel de l’opération
mmap
- Le fichier
/dev/mem
offre ce service par défaut - Il est possible d’implémenter ce service avec un son propre pilote
Avantages et inconvénients
Les pilotes orientés mémoire (uio-driver) offrent une alternative intéressante lors de migration d’applications et de leurs pilotes d’un OS propriétaire vers Linux ou lorsque l’interface avec les périphériques à gérer est simple
Avantages:
- Pas (ou peu) d’adaptations en cas de mise à jour du noyau Linux
- Choix du langage de programmation
- Accès à toutes les librairies (par exemple calcul en virgule flottante autorisé)
- Accès aux registres plus efficace (pas d’appel système)
- Pas de problèmes de licences liés à Linux (GPL)
Désavantages:
- Pas de support pour le traitement des interruptions
- Fonctionnalité des pilotes est limitée au développement d’application en mode user
- Séparation en kernel space et user space est abandonnée
- Système peut devenir plus complexe (mauvaise abstraction / API)
Implémentation du pilote dans l’espace utilisateur
L’implémentation d’un pilote de périphériques orientés mémoire s’implémente à
l’aide de 5 opérations (#include <sys/mman.h>
)1
- Ouverture du fichier correspondant au pilote
int fd = open (...)
- Appel de l’opération mmap afin de placer dans la mémoire virtuelle du processus les
registres du périphérique
void* mmap ( void* addr, // généralement NULL, adresse de départ en mémoire virtuelle size_t length, // taille de la zone à placer en mémoire virtuelle (souvent // un multiple de la taille de page) int prot, // droits d'accès à la mémoire: read, write, execute int flags, // visibilité de la page pour d'autres processus: shared, // private int fd, // descripteur du fichier correspondant au pilote off_t offset); // offset des registres en mémoire physique. Souvent // un multiple de la taille de page
- Opérations sur le périphérique à l’aide de l’adresse virtuelle retournée par
l’opération
mmap
- Après utilisation, appel de l’opération
munmap
pour libérer l’espace mémoiremunmap (...)
- Fermeture du fichier
close (...)
-
C’est bien
mman.h
et pasmmap.h
.mman
est une abréviation de memory management. ↩