uevent envoyé depuis le noyau vers l'espace utilisateur (udev)
Je savais que udev joue sur le système linux, et il reçoit uevents envoyés à partir du noyau par des netlink socket.
Cependant, mes questions sont les suivantes:
- Comment noyau envoie l'événement ? Il doit être quelque chose déclenchée par l'ajout/retrait de l'appareil et envoie alors des événements de udev. Comment fonctionne le noyau de ce faire? (Est-il un exemple de code je peux le trouver? )
- udev reçoit ces uevents uniquement par le biais de netlink socket. C'est la seule façon que udev t-il. Est-ce correct?
- Quand uevent est envoyé par le noyau, je savais qu'il peut faire de la diffusion. Cependant, Peut-il faire de monodiffusion?
Merci pour tous vos commentaires.
source d'informationauteur Sam
Vous devez vous connecter pour publier un commentaire.
Il envoie message netlink appelé uevent. uevent est tout simplement les cordes de certains format spécial qui est envoyé via netlink socket. Exemple:
Noyau de la fonction qui envoie uevent est
kobject_uevent_env
et c'est wrapperkobject_uevent
qui est appelé dans de nombreux endroits.Oui, udev fonctionne en recevant uevents de netlink socket. Mais il y a une option du noyau peut appeler usermode helper. Dans ce cas, le noyau génère un processus par hotplug événement, en fournissant des variables d'environnement pour chaque nouveau processus décrivant notamment événement de connexion à chaud. Si vous regardez
kobject_uevent_env
vous verrez que netlink message est en fait#ifdef
'ed et l'action par défaut est d'appeler que usermode helperEn théorie netlink messages peuvent être broadcast, multicast et unicast, mais le noyau envoie message de diffusion avec
netlink_broadcast_filtered
appel. De toute façon, ce message va à la prise deNETLINK_KOBJECT_UEVENT
de la famille. Vous pouvez voir netlink socket création enuevent_net_init
.Pour répondre à votre commentaire question. Vous ne verrez pas de
send
fonction dans le noyau.send
est un appel système - il est à l'interface noyau fournit à l'espace utilisateur, mais le noyau lui-même n'utilise pas de syscalls. Il y a une longue chaîne d'appels de fonction (en net/netlink/af_netlink.c et net/core/dev.c) à partir dekobject_uevent_env
pour la finale de l'envoi, qui ne contient aucunsend
que le noyau de l'envoi de skb (tampon de socket) est quelque chose comme le placement de la mémoire tampon dans la file d'attente, puis en appelant planificateur de livrer la mémoire tampon et de l'informer de l'espace utilisateur qui est en attente sur syscallrecv
Ressources: