2011-11-02 8 views

Répondre

4

Il existe , mais le doit toujours être utilisé dans l'espace noyau pour la gestion. OTOH, si vous avez juste besoin de remarquer l'interruption, vous n'avez pas besoin de la partie noyau.

5

L'expérience indique qu'il est possible d'écrire des pilotes d'espace utilisateur stables et de bonne qualité pour presque toutes les cartes PCI. Cela nécessite juste une certaine sophistication et une petite couche de proxy dans le noyau. UIO est un pas dans cette direction, mais si vous voulez gérer correctement les interruptions dans l'espace utilisateur, UIO peut ne pas suffire, par exemple si le périphérique ne prend pas en charge le bit de désactivation d'interruption de PCI sur lequel UIO s'appuie. Notez que les latences de réveil de processus sont de quelques microsecondes, donc si votre implémentation nécessite une latence très faible, alors l'espace utilisateur peut être un frein.

Si je devais mettre en œuvre un pilote de l'espace utilisateur, je réduirais le ISR du noyau juste une opération « désactiver & ack & réveil-userpace », gérer l'interruption dans le processus waked-up, et puis réactivez l'interruption (bien sûr, en écrivant à la mémoire PCI mappée à partir du processus de l'espace utilisateur).

+0

Quand nous faisons pilote userspace, est-il logique d'effacer interruption dans le noyau ou dans l'espace utilisateur? Je pense qu'il devrait être clair lorsque la manipulation est terminée (donc dans l'espace utilisateur), non? – ransh

1

Avoir à déclencher le code de l'utilisateur indirectement. Noyau ISR indique une interruption en écrivant un fichier/un registre/une signalisation de réglage. L'application d'espace utilisateur interroge ceci et continue avec le code approprié. Cas de limites: plus ou moins d'interruptions que prévu (délai dépassé/trop d'interruptions par intervalle de temps)

L'abstraction de fichier Linux est utilisée pour connecter le noyau et l'espace utilisateur. Ceci est effectué par des dispositifs de caractères et ioctl() appels. Certains peuvent préférer les entrées sysfs à cette fin. Cela peut sembler étrange car les notifications de périphériques déclenchées par un événement (interruptions) sont associées à l'interrogation «déclenchée par le temps», mais il s'agit en réalité d'un blocage asynchrone (lecture/sélection). Quoi qu'il en soit, certaines questions se posent en fonction de la performance.

Les interruptions ne peuvent donc pas être gérées directement en dehors du noyau. E.g. La mémoire partagée peut se trouver dans l'espace utilisateur et, avec certains paramètres d'autorisation d'E/S, les adresses peuvent être mappées, donc l'E/S fonctionne, mais pas pour la gestion directe des interruptions.

J'ai trouvé qu'un seul 'rapport minoritaire' dans le sujet vfio (http://lxr.free-electrons.com/source/Documentation/vfio.txt): https://stackoverflow.com/a/21197797/5349798

des questions similaires:

Running user thread in context of an interrupt in linux

Is it possible in linux to register a interrupt handler from any user-space program?

Linux Kernel: invoke call back function in user space from kernel space

Linux Interrupt vs. Polling

Linux user space PCI driver

How do I inform a user space application that the driver has received an interrupt in linux?

Questions connexes