Question

J'essaie actuellement de créer un module de noyau qui produira des données basées sur les événements du noyau et les poussera dans un fichier. Après avoir lu que c'était mauvais (et je suis d'accord), j'ai décidé qu'il serait plus logique d'avoir les données dans un fichier / proc qu'un programme utilisateur pourrait extraire si nécessaire. Cependant, cette idée a conduit à toutes sortes de problèmes, notamment quand et comment effacer ce fichier. Alors j'ai pensé ... "Pourquoi ne pas créer un pipe nommée dans / proc et lire à partir de cela?"

L’idée générale qui m’appelle de définir une fonction de lecture et une fonction d’écriture pour un fichier proc, mais j’ai toujours des problèmes de conception quant à la façon de procéder. À savoir, comment pourrais-je écrire une telle fonction pour prendre des données arbitraires et les écrire sur un tel tuyau à partir du noyau? Quelqu'un at-il une idée de la façon dont vous pousseriez des données vers un canal nommé depuis l'espace noyau? En fin de compte, il n'est pas obligé d'être un fichier / proc (en particulier si j'ai tort de le faire), mais c'est la conclusion à laquelle je suis arrivé. Ensuite, je devrai trouver comment y attacher un programme en espace utilisateur, mais j'estime qu'il s'agit d'un problème distinct.

Était-ce utile?

La solution

Au lieu de créer un canal nommé, vous souhaitez créer un "périphérique caractère". Si vous voulez une interaction simple ou la diffusion en continu des données du noyau vers l’espace utilisateur et retour, c’est la méthode habituelle. Je vous recommande de rechercher des périphériques similaires dans le noyau Linux et de voir ce qu'ils font.

Autres conseils

Je pense que la façon dont cela est généralement fait consiste à utiliser un socket netlink; un ou plusieurs processus de l'espace utilisateur peuvent être liés à un " netlink " adresse, et votre noyau peut diffuser des messages à n’importe lequel d’entre eux, le cas échéant.

C’est certainement ce que certaines choses font, notamment le sous-système de gestion de réseau. Il est possible pour un programme en espace utilisateur de surveiller les modifications apportées aux interfaces réseau (par exemple, les nouvelles adresses IP, les modifications d’état des liens) à l’aide de cette méthode.

Je suis d'accord avec Paul: la meilleure solution consiste probablement à implémenter un appareil à caractères. Peut-être en regardant le code implémentant / dev / kmem ou / dev / rtc [0-9]. De plus, les pilotes série implémentent leurs pilotes en utilisant des périphériques de caractères.

Pensez-y simplement à un périphérique virtuel. : -)

/ proc n'est pas réellement un système de fichiers réel ; il est construit par le noyau en fonction de ce qui est en cours d'exécution. Je ne pense pas que vous puissiez créer des pipes nommés.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top