Userspace vs espace noyau conducteur
Je suis à la recherche d'écrire un PWM pilote. Je sais qu'il y a deux façons de contrôler un pilote de matériel:
- De l'espace utilisateur pilote.
- L'espace noyau conducteur
Si en général (ne pas envisager un PWM pilote de cas) nous avons à prendre une décision d'aller de l'utilisateur de l'espace ou de l'espace noyau conducteur. Alors quels sont les facteurs que nous avons à prendre en considération en dehors de ces?
- De l'espace utilisateur pilote peut directement mmap() /dev/mem mémoire de leur espace d'adressage virtuel et n'ont pas besoin de changement de contexte.
- De l'espace utilisateur pilote ne peut pas avoir d'interruption gestionnaires de mise en œuvre (Ils ont d'interrogation pour interrompre).
- Pilote de l'espace utilisateur ne peut pas effectuer de DMA (Comme DMA capable de la mémoire peut être attribuée à partir de l'espace noyau).
- Sécurité: les autorisations de fichier de l'appareil nœud de contrôle qui les utilisateurs peuvent ouvrir/lire/écrire sur le périphérique. Les opérations de fichiers autoriser ou de refuser les opérations simultanées.
- La décision peut dépendre fortement de ce que vous PWM pratiquent, et l'utilisation de ce matériel.
InformationsquelleAutor Katoch | 2013-03-08
Vous devez vous connecter pour publier un commentaire.
De ces trois facteurs que vous avez énumérés, seul le premier est vraiment bon. Comme pour le reste, pas vraiment. Il est possible pour un utilisateur de l'espace de code pour effectuer des DMA de l'exploitation — pas de problème avec ça. Il y a beaucoup de matériel appareil entreprises qui emploient cette technique dans leurs produits. Il est également possible d'avoir une interruption application de l'espace utilisateur, même lorsque tous les I/O est fait avec un noyau plein de dérivation. Bien sûr, il n'est pas aussi facile de faire un
mmap()
sur/dev/mem
.Vous devez disposer d'une infime partie de votre pilote dans le noyau de ce qui est nécessaire afin de fournir à votre espace utilisateur, avec un minimum dont il a besoin à partir du noyau (parce que si vous pensez à ce sujet —
/dev/mem
est également soutenue par un pilote de périphérique caractère).Pour le DMA, il est effectivement trop facile — tout ce que vous avez à faire est de gérer les
mmap
demande et à la carte d'un tampon DMA dans l'espace utilisateur. Pour interrompt — il est un peu plus délicat, l'interruption doit être gérée par le noyau de n'importe quoi, cependant, le noyau ne peut pas faire tout le travail et me réveille le processus qui l'appelle, disons,epoll_wait()
. Une autre approche est de fournir un signal au processus, comme le fait par DOSEMU, mais qui est très lent et n'est pas recommandé.Comme pour votre question, un seul facteur que vous devez prendre en considération est le partage des ressources. Tant que vous n'avez pas à partager un périphérique à travers de multiples applications et il n'y a rien que vous ne pouvez pas le faire dans l'espace utilisateur pour l'espace utilisateur. Vous aurez probablement économiser des tonnes de temps pendant le cycle de développement que l'écriture de l'espace utilisateur code est extrêmement simple. Toutefois, lorsque deux ou plusieurs applications qui ont besoin de partager le périphérique (ou de ses ressources), alors les chances sont que vous allez passer énormément de temps à faire il possible — juste imaginer de multiples processus de fourches, de s'écraser, de la cartographie (la même?) mémoire simultanément etc. Et après tout, l'IPC se fait généralement par le noyau, de sorte que, si la demande aurait besoin pour commencer à "parler" les uns aux autres, les performances peuvent se dégrader considérablement. Ce n'est encore fait dans la vie réelle pour certains de la performance des applications critiques, si, mais je ne veux pas entrer dans ces détails.
Un autre facteur est le noyau de l'infrastructure. Disons que vous voulez écrire un pilote de périphérique réseau. Ce n'est pas un problème de le faire dans l'espace utilisateur. Toutefois, si vous le faites, alors vous aurez besoin de rédiger un réseau complet de la pile de trop car il ne sera pas possible à l'utilisateur de Linux par défaut de celui qui vit dans le noyau.
Je dirais go pour l'utilisateur de l'espace si c'est possible et que le montant de l'effort de faire des choses de travail est inférieure à la rédaction d'un pilote du noyau, et en gardant à l'esprit qu'un jour il pourrait être nécessaire de passer le code dans le noyau. En fait, c'est une pratique courante d'avoir le même code est compilé pour les deux de l'espace utilisateur et l'espace noyau selon que certains macro est définie ou pas, car les essais dans l'espace utilisateur est beaucoup plus agréable.
Une autre considération: il est beaucoup plus facile à déboguer les pilotes espace-utilisateur. Vous pouvez utiliser gdb, valgrind, etc. Heck, vous n'avez même pas à écrire votre pilote dans C.
Il y a une troisième option-delà de l'utilisateur de l'espace ou de l'espace noyau pilotes: l'un des deux. Vous pouvez le faire seulement le noyau de l'espace-seulement des choses dans un pilote de noyau et de faire tout le reste en espace utilisateur. Vous pourriez même ne pas avoir à écrire l'espace du noyau conducteur, si vous utilisez Linux UIO pilote de cadre (voir https://www.kernel.org/doc/html/latest/driver-api/uio-howto.html).
J'ai eu de la chance de l'écriture d'un DMA capable pilote presque complètement dans l'espace utilisateur. UIO fournit l'infrastructure de sorte que vous pouvez juste lire/sélectionner/epoll sur un fichier à attendre une interruption.
Vous devez être conscient des implications de sécurité de la programmation de la DMA descripteurs à partir de l'espace utilisateur: sauf si vous avez une certaine protection dans l'appareil lui-même ou une IOMMU, l'utilisateur de l'espace conducteur peut causer à l'appareil de lire ou d'écrire dans n'importe quelle adresse dans la mémoire physique.