2009-02-05 14 views
2

Nouveau dans la programmation Linux en général.Méthodes de communication entre le noyau et les applications utilisateur

J'essaie de communiquer avec un module du noyau via la mémoire partagée, mais je ne peux pas appeler les fonctions utilisées dans les applications utilisateur telles que shmget(); J'ai installé kernel-headers et kernel-devel, et inclus, à la source du module noyau, mais les en-têtes ne contiennent aucune fonction.

Existe-t-il une manière standard d'utiliser la mémoire partagée dans le noyau?

De plus, toutes les astuces sur l'utilisation des prises dans la même situation seront d'une grande aide.

En utilisant Distro: Noyau CentOS 5.2 : 2.6.18-92.1.22.e15

Merci à l'avance.

// Ajouté // Pour clarifier les choses, je suis en train de faire une démonstration qui a des caractéristiques communes d'un projet linux typique embarqué. L'objectif final étant de le porter vers LynxOS pour voir quels types de problèmes peuvent survenir sur des projets plus importants.

Actuellement, les principales caractéristiques de la démo sont multi-processus, tuyaux, questions message, mémoire partagée, sockets, multi-threads.

Il a une application utilisateur et un module de noyau chargeable communiquant les uns avec les autres. des canaux et des messages entre deux processus dans l'application utilisateur, et des sockets à mémoire partagée et entre l'application utilisateur et le module noyau.

Si je suis en train de faire quelque chose de faux, dites-le moi s'il vous plaît.

Répondre

3

Votre but ne me semble pas très clair. La mémoire partagée n'est pas un moyen de communiquer entre l'espace utilisateur et l'espace noyau. Si vous voulez avoir accès à de la mémoire allouée par le noyau, une façon de procéder est d'implémenter l'appel système mmap.

Si vous avez vraiment besoin d'écrire du code noyau, la lecture recommandée est la suivante: linux device driver third edition, et le chapitre 15 est celui que vous recherchez. Une fois que vous avez de la mémoire partagée, vous aurez probablement besoin d'un moyen de faire de la synchronisation, c'est-à-dire travailler sur une partie du noyau, tout en utilisant une autre partie dans l'espace utilisateur. Un exemple de partage de mémoire/userspace/kernel est le V4L2 API. Une explication plus amicale peut être trouvée dans le LWN series à ce sujet. Cependant, si vous étiez plus spécifique dans ce que vous voulez faire, vous recevriez une aide plus spécifique sur la façon de le faire, si vous avez vraiment besoin d'un module noyau, du code du noyau que vous pourriez avoir et donc sur. Pour la chose socket, je ne sais pas assez, mais vous devriez google pour linux + kernel + netlink. Il est utilisé pour communiquer avec le noyau à partir de l'espace utilisateur via un appel socket "standard", mais je n'ai vraiment aucune idée sur la façon de l'utiliser dans un module.

+0

merci pour le conseil! Je voulais faire un programme de démo qui a utilisé ty caractéristiques techniques que l'on pourrait utiliser sur un projet linux intégré. Clarifiera en éditant la question – Saifis

2

Le noyau peut accéder à la mémoire dans l'espace utilisateur automatiquement, il y a beaucoup d'exemples dans le noyau déjà (Indice: open() a besoin d'accéder userspace pour lire le nom du fichier à ouvrir)

Il est pas clair ce que votre utilisation le cas est, s'il vous plaît être plus précis.

La manière normale de communiquer entre l'espace utilisateur et le noyau est via les appels sys; vous pouvez ajouter les vôtres (pas nécessairement recommandé) ou étendre celles qui existent déjà (ioctl sur un périphérique de caractères est typique).

Un grand nombre de modules du noyau mettre en œuvre un fichier de périphérique spécial, c'est ce que les pilotes de périphériques (la plupart) font (sauf les interfaces réseau, qui ne sont pas fichiers spéciaux sous Linux)

+0

Merci, va chercher dans le noyau. – Saifis

0

suivants sont des moyens par lesquels vous pouvez parler au noyau mmap fichiers de périphérique (vous écrivez un pilote de périphérique simple, ou vous utilisez également des fichiers fifo, des sockets Netlink (pile réseau), des sockets (réseau), ou écrivez votre appel système ... si vous me dites en détail ce que vous voulez exactement, je peux vous aider plus