Est-il possible d'appeler un utilisateur de l'espace de fonction de rappel à partir de l'espace noyau sous Linux (ioctl)?
Est-il possible d'étendre l'interface ioctl dans Linux, de sorte que l'application de l'espace utilisateur peut envoyer un pointeur à une fonction de l'espace du noyau conducteur?
Je suis en particulier la pensée de façons de gérer le flux dans contrôlable par l'utilisateur moyen, mais le faire dans le noyau. Ces opérations pourraient être attachées à des modules du noyau, mais cela ferait de développement beaucoup plus facile que je n'aurais pas besoin de jouer avec le noyau au cours du développement.
Plus précisément, ce serait le processus:
- Les données sont lues par le conducteur d'un tampon.
- De données est gérée par ces fonctions définies par l'utilisateur.
- Peu plus de la manipulation se fait, peut-être avec quelques HW blocs.
- De données est utilisé par une application de l'espace utilisateur.
Utilisateur exécutant le code fourni dans l'espace noyau serait d'ouvrir un énorme trou de sécurité dans le système.
Je sais, mais même si ce n'était que pour le développement initial, il serait très utile.
Je ne pense pas qu'il veut exécuter en mode utilisateur code dans le contexte du noyau, mais plutôt quelque chose comme l'appel de son syscall de code d'utilisateur, disparition il du gestionnaire de rappel pointeur, un noyau de retour au mode utilisateur sur chaque appel, de sorte qu'il semble juste comme un rappel de l'utilisateur perspective de code.
C'est à peu près ce que je pensais, j_kubik.
Je sais, mais même si ce n'était que pour le développement initial, il serait très utile.
Je ne pense pas qu'il veut exécuter en mode utilisateur code dans le contexte du noyau, mais plutôt quelque chose comme l'appel de son syscall de code d'utilisateur, disparition il du gestionnaire de rappel pointeur, un noyau de retour au mode utilisateur sur chaque appel, de sorte qu'il semble juste comme un rappel de l'utilisateur perspective de code.
C'est à peu près ce que je pensais, j_kubik.
OriginalL'auteur Makis | 2010-04-22
Vous devez vous connecter pour publier un commentaire.
Je pense que vous pouvez obtenir ce que vous voulez en ayant votre permis de fournir un ou plusieurs appareils (ou les périphériques de bloc) que vos applications de l'espace utilisateur s'ouvre.
Alors vous pouvez utiliser inotify (linux journal article) pour le noyau->utilisateur de l'espace de la communication événementielle. Ioctl ou en écrivant à l'appareil pour l'espace utilisateur->noyau de la communication événementielle. L'échange de données peut également être obtenu par la lecture/écriture à un ou plusieurs fichiers de périphériques.
Sinon, vous pouvez fournir /proc et /sys système de fichiers d'entrées ou de l'utilisation de netlink.
Vous pouvez également envisager ksocket:
OriginalL'auteur hlovdal
Je pense que vous allez avoir un carré cercle: si le noyau simplement exécuter votre "userland" directement à la fonction, il ne serait pas "userland" mais plutôt un homebrew module chargeable système. Je suppose que ce que vous vraiment veux, c'est un moyen de comprendre ce à faire à faire, tout le travail sans s'écraser votre PC chaque fois que vous faites une erreur. Vous pourriez peut-être l'abus de gestionnaires de signaux comme le moyen de "rappel", mais je suis trop rouillé pour montrer comment vous obtenez retour pour le noyau, comme si par un appel de fonction de retour. Le problème ici est que, dans tout l'espace utilisateur->noyau de changement de contexte, le noyau commence avec une nouvelle pile, de sorte que l'adresse de retour est révolue depuis longtemps. Que diriez-vous si vous combinez un gestionnaire de signal avec mmap require /dev/mem, et laissez votre userland pseudodriver poke le pilote en mode noyau de structures de données directement? Mais alors, vous êtes de retour à redémarrer lorsque vous faites une erreur, à moins que vous comprendre comment mmap seulement votre permis de structures de données? D'autres repurposeable mécanismes pourraient être des RUISSEAUX et de la ligne ATS disciplines; je pense que ces conférer une sorte de transmogrifying capacité. Bien entendu, tout cela est une bonne idée comme une solution permanente!
OriginalL'auteur Bernd Jendrissek
Votre cas d'utilisation continue de mentionner des données.
Peut-être ce que vous voulez faire est de partager la mémoire entre le noyau et un processus utilisateur. Vous pourriez mettre des données et/ou des commandes dans la mémoire partagée, et le processus/le code du noyau de l'autre côté pourrait le lire et de faire quoi que ce soit. Le get_user_pages_fast() l'appel peut rendre la mémoire d'un processus accessible pour le noyau, même si le processus n'est pas en cours d'exécution.
OriginalL'auteur Andy Grover