2 votes

Comment puis-je informer une application espace utilisateur que le pilote a reçu une interruption sous Linux ?

J'ai un périphérique PCIe qui enverra une interruption matérielle lorsqu'un tampon de données est prêt à être lu. Je crois que la meilleure approche pour cela est d'utiliser des signaux, mais je ne suis pas tout à fait sûr de la manière. Ce que je crois devoir faire est le suivant :

  1. Enregistrer le PID de l'application de l'espace utilisateur pour que le pilote sache où envoyer le signal
  2. Dans le gestionnaire d'interruption du pilote de périphérique PCIe, envoyer un signal à l'application de l'espace utilisateur
  3. Dans l'application de l'espace utilisateur, mettre en œuvre une fonction de gestionnaire de signal pour traiter le signal

Je ne suis pas sûr de comment faire l'une ou l'autre de ces choses. Comment/Où enregistrer le PID de l'application de l'espace utilisateur ? Comment envoyer un signal à ce PID spécifique à partir du gestionnaire d'interruption du pilote (je crois devoir utiliser la commande kill mais je suis plus intéressé par la syntaxe d'obtention du PID) ? Comment faire attendre l'application de l'espace utilisateur le signal après avoir enregistré son PID ? Est-il possible de permettre à l'application de l'espace utilisateur de continuer à s'exécuter après avoir enregistré son PID, d'exécuter la fonction de gestionnaire de signal lorsqu'un signal est reçu, et de reprendre son exécution là où elle était avant l'arrivée du signal ? (similaire au fonctionnement d'un ISR)

2voto

Paul Coccoli Points 497

Ne pas utiliser de signaux pour cela. Implémentez un dispositif de caractère. L'application de l'espace utilisateur va ouvrir puis appeler lire et sera bloquée jusqu'à ce que votre pilote détermine qu'il y a des données disponibles.

Voir Linux Device Drivers chapitre 3, je crois.

0voto

renonsz Points 93

Doit gérer l'interruption directement dans le noyau. Pour transmettre le PID au noyau, doit utiliser l'abstraction des fichiers de périphériques (par exemple les appels ioctl()), mais cela fournit également une notification asynchrone via read/select donc la solution de signal est remplacée.

0voto

FabienM Points 1106

Ceci est une vieille question, mais pour gérer les IRQ depuis l'espace utilisateur de l'application, le meilleur moyen maintenant est d'utiliser le pilote UIO et l'appel poll/select sur /dev/uioX.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X