web-dev-qa-db-fra.com

Appelez une fonction de module de noyau du programme dans l'espace utilisateur

J'ai développé un module de noyau et certaines fonctions à ce sujet. Maintenant, je dois développer un programme dans l'espace utilisateur et appeler certaines fonctions dans le module du noyau.

J'ai également besoin d'accéder à une variable globale située dans le module du noyau de mon programme dans l'espace utilisateur.

23
Ricardo

Il existe une vue d'ensemble complète du module de linux-noyau et du programme d'espace utilisateur interagissant http://wiki.tldp.org/kernel_user_space_howto " espace de noyau, interfaces de l'espace utilisateur "par Ariane Keller (c'est à partir de 2008-09-28, mais d'environ 2,6 noyaux; seule la nouvelle façon majeure est relaisfs ) ==)

Aucun appel de fonction ordinaire de l'espace utilisateur à l'espace de noyau est répertorié, seuls SysCall (Ajouter un nouveau système SysCall n'est pas facile) et UPCALL (appelez dans la direction inverse).

L'une des interfaces faciles est IOCTL; Mais vous ne pouvez pas commencer à utiliser IOCTL avant de créer des procfs, des systèmes SYSFS ou SIMILIAR.

Autre est SYSCTL; Mais SYSCTL est plus éligible à la lecture/écriture à la variable globale. (Il est difficile de passer plusieurs paramètres via une interface SYSCTL).

24
osgx

Vous semblez manquer le point de la séparation du noyau et de la zone utilisateur. Si votre programme utilisateur pourrait modifier directement des données à l'intérieur du noyau, cela conduirait rapidement à une catastrophe.

Il n'y a qu'un seul moyen conventionnel pour un programme utilisateur de demander explicitement des services à partir du noyau ((make a system call .

Il y a aussi TRAPS et certains mécanismes de communication userland-wernel spécifiques à Linux, mais ceux-ci ne sont pas pertinents ici.

6
Nikolai Fetissov

Comme les autres affiches ont mentionné, il existe une distinction claire entre le noyau et l'espace utilisateur. Donc, non, vous ne pouvez pas appeler une fonction de noyau directement à partir de l'espace utilisateur. Je pense que le moyen le plus simple d'envoyer des messages entre utilisateurpace et espace du noyau est via NetLink Sockets. Une prise NetLink vous permet de passer facilement des structures de données arbitraires entre le niveau utilisateur et le niveau du noyau.

Oui IOCTL, les appels système sont des alternatives viables, elles ne sont pas aussi flexibles que la prise NetLink pour réussir les informations arbitraires.

Exemple de code ici: http://people.ee.thz.ch/~arkeller/linux/multi/kernel_user_space_howto-3.html

5
ajpyles

Vous aurez besoin d'installer un nouveau noyau pour utiliser le nouvel appel que si vous avez déjà un mécanisme pour mettre à jour le noyau ... http://www.ycyberciti.biz/tips/how-to-patch -Running-linux-kernel.html

1
Jay