2010-07-20 22 views
6

Je suis un nouveau venu dans la programmation du module Linux Kernel. À partir du matériau que je l'ai lu jusqu'à présent, j'ai trouvé qu'il ya 3 façons pour un programme utilisateur pour demander des services ou de communiquer avec un module du noyau LinuxQuelles options avons-nous pour la communication entre un programme utilisateur et un module noyau Linux?

  1. un fichier de périphérique dans/dev
  2. un fichier dans le système de fichiers/proc
  3. ioctl() appelez

question: Quelles sont les autres options que nous avons pour la communication entre programme utilisateur et le module du noyau linux?

Répondre

6

Votre option 3) est vraiment une sous-option de l'option 1) - ioctl() est une façon d'interagir avec un fichier de périphérique (read() et write() étant les moyens habituels).

Deux autres façons à considérer sont:

  • Le système de fichiers sysfs;
  • Sockets Netlink.
+0

Les sockets Netlink semblent prometteurs mais n'ont pas été en mesure de trouver un exemple de travail utilisant des sockets Netlink. Géré pour écrire le mien, mais encore beaucoup de questions sans réponse. – binW

6

Fondamentalement, de nombreux mécanismes IPC standard - cf. http://en.wikipedia.org/wiki/Inter-process_communication - peut être utilisé:

  1. fichier et le fichier mappé en mémoire: un fichier de périphérique (comme ci-dessus) ou d'un fichier de la même répertoire/dev, procfs, sysfs, debugfs, ou un système de fichiers de votre propre, produit cartésien avec lecture/écriture, ioctl, mmap

  2. Eventuellement signaux (pour une utilisation avec un kthread)

  3. Sockets: en utilisant un protocole de choix: TCP, UDP (cf. . knfsd, mais probablement pas trop facile), PF_LOCAL ou Netlink (beaucoup subinterfaces - NetLink de base, genetlink, connecteur, ...)

De plus,

4. appels système (non vraiment utilisable des modules si)

5. Interfaces réseau (semblable à tun).

de travail exemples de Netlink - pour ne citer que quelques-uns - se trouvent par exemple dans

  • git: //git.netfilter.org/libmnl (côté userspace)
  • net/core/rtnetlink .c (base netlink)
  • net/netfilter/nf_conntrack_netlink.c (nfnetlink)
  • fs/quota/netlink.c (genetlink)
3

Cela inclut tous les types avec des exemples :)

http://people.ee.ethz.ch/~arkeller/linux/kernel_user_space_howto.html

+1

Votre droit le lien contient beaucoup d'informations utiles, mais les liens ne sont pas des réponses. S'il vous plaît voir http://stackoverflow.com/questions/how-to-answer qui explique pourquoi les liens simples ne sont pas ce que SO veut. – stsquad

+0

J'ai répondu à votre "" Quelles autres options avons-nous pour la communication entre le programme utilisateur et le module noyau Linux? "" Partie de la question..si vous aviez demandé d'autres options et comment fonctionnent-elles j'aurais écrit quelques pages à leur sujet, la raison pour laquelle je vous ai donné ce lien car il a des exemples de travail avec eux, que je pensais être explicite. – Santi1986

+1

Comme les pages de stackoverflow expliquent que les liens vers des pages externes peuvent être transitoires. Si la page liée disparaît, la réponse devient soudainement inutile. Personne ne suggère que vous avez besoin d'écrire un essai, mais un résumé des options aurait fait une réponse plus utile. – stsquad

1

This Linux document donne quelques-unes des façons dont l'espace noyau et l'utilisateur peut interagir (communiquer). Ils sont les suivants.

  • Procfs, sysfs, et des mécanismes similaires. Ceci inclut également les entrées /dev, et toutes les méthodes dans lesquelles l'espace noyau expose un fichier dans l'espace utilisateur (les entrées/proc,/dev, etc. sont essentiellement des fichiers exposés à partir de l'espace du noyau).
  • Socket mécanismes basés. Netlink est un type de socket, qui est conçu spécialement pour la communication entre l'espace utilisateur et l'espace noyau.
  • System calls.
  • Upcalls. Le noyau exécute un code dans l'espace utilisateur. Par exemple engendrer un nouveau processus.
  • mmap - Mappage de la mémoire d'une région de la mémoire du noyau à l'espace utilisateur. Cela permet à la fois au noyau et à l'espace utilisateur de lire/écrire dans la même zone de mémoire.

À part cela, la liste suivante ajoute d'autres mécanismes que je connais.

  • Interrupts. L'espace utilisateur peut déclencher des interruptions pour parler à l'espace noyau. Par exemple, certains processeurs utilisent int80 pour effectuer des appels système (tandis que d'autres peuvent utiliser un mécanisme différent comme l'instruction syscall). Le noyau doit définir le gestionnaire d'interruption correspondant à l'avance.
  • vDSO/vsyscall - Ce sont des mécanismes dans le noyau Linux pour optimiser l'exécution de certains appels système. L'idée est d'avoir une région de mémoire partagée, et quand un processus fait un appel système, la bibliothèque d'espace utilisateur obtient des données de cette région, au lieu d'appeler réellement l'appel système correspondant. Cela économise le changement de contexte.