2017-02-16 1 views
0

J'écris un pilote et j'essaie d'envoyer quelque chose du noyau à l'espace utilisateur, ce que je vais faire (c'est la seule façon que je connaisse), c'est d'envoyer un signal du noyau vers l'espace utilisateur et d'appeler (...) quelque part dans l'espace utilisateur, qui va l'attraper et utiliser ioctl (...), c'est maintenant le noyau temporel qui envoie des choses à l'espace utilisateur.Le signal envoyé du noyau vers l'espace utilisateur est-il en temps réel?

Ma question est, quand le signal est envoyé, il doit attendre l'appel de l'espace utilisateur appel signal(), puis faire quelque chose?

Et y a-t-il d'autres façons de parler entre le noyau et l'espace utilisateur?

+1

Je crois que l'envoi de signaux est asynchrone. L'une des façons les plus simples d'interagir entre le noyau et l'utilisateur sont les opérations ioctl/read/write sur divers périphériques de caractères. – yeputons

+0

Quel est le pilote exact que vous codez, et quelle est l'information exacte que vous devez envoyer du noyau vers l'espace utilisateur, et quand? S'il vous plaît ** modifier votre question ** pour donner * beaucoup plus de détails * –

Répondre

0

Avez-vous envisagé d'avoir votre pilote juste envoyer quelques octets sur un descripteur de fichier (par exemple socket(7) ou pipe(7) ou périphérique de caractères ..)? Ou en utilisant netlink(7)? Ou interagir avec systemd?

Une manière courante serait d'avoir un certain processus d'assistance dans la zone utilisateur (démarré au démarrage) gérant ce descripteur de fichier. Ce programme utiliserait probablement un appel système de multiplexage comme poll(2).

Attention, lorsque votre pilote est en cours d'exécution (et que vous essayez d'envoyer un signal), la tâche en cours peut ne pas être un processus utilisant votre pilote. Envoyer des signaux à partir de la terre du noyau pourrait donc être difficile.