web-dev-qa-db-fra.com

Comment comprendre le flux de détection USB?

Je voudrais comprendre le flux des événements USB de l’espace noyau à l’espace utilisateur (par curiosité, savoir comment les choses sont mises en œuvre).

Pour être plus clair, j'aimerais savoir comment cela se passe sur mon bureau lorsque je connecte un lecteur USB à mon système et comment le lecteur est monté.

J'aimerais aussi savoir comment il découvre si des images sont présentes sur ma clé USB et si "oui", comment il me demande si je dois l'ouvrir dans GIMP ou un autre logiciel?

Je sais que c’est une question très vaste et vaste, mais veuillez me guider avec quelques conseils sur la façon de comprendre toute l’idée qui la sous-tend.

Je n'ai pas fait de navigation de code volumineux, mais je vous assure que je n'ai aucun problème à le faire si je peux être guidé correctement.

14
Sen
  1. Le périphérique est branché et le logiciel qui gère le bus matériel pour ce périphérique reçoit une interruption (ou une autre notification au niveau matériel), et le pilote de bus énumère les périphériques attachés ou effectue d'autres actions matérielles spécifiques au bus pour identifier le périphérique.
  2. Le noyau demande à charger un pilote pour le nouveau matériel en appelant / sbin/modprobe avec l'identificateur de bus/périphérique/etc. du matériel.
  3. Dans l'espace utilisateur, modprobe essaie de trouver un alias correspondant spécifié par le pilote. (Voir /lib/modules/$(uname -r)/modules.alias pour la liste complète.) Celles-ci seront différentes en fonction de l'interface matérielle. Par exemple, pci:v0000102Bd00002527sv*sd*bc*sc*i* pour un fournisseur de périphériques PCI 102B, un périphérique 2527 et tout ce qui concerne le sous-fournisseur, etc., ou USB: usb:v2040p4982d*dc*dsc*dp*ic*isc*ip*.
  4. une fois le pilote de périphérique chargé (ou un nouveau périphérique disposant déjà d'un pilote), le pilote du noyau envoie une notification du périphérique chargé à udev dans l'espace utilisateur.
  5. udev compare la notification à sa liste de règles dans /lib/udev/rules.d/ et /etc/udev/rules.d. A partir de là, le comportement est extrêmement spécialisé, basé sur les règles.
  6. Dans le cas d'un disque USB, le fichier 80-udisks.rules est probablement le meilleur endroit pour travailler. Ces règles utiliseront des éléments tels que blkid et d’autres aides pour analyser le type et le contenu d’un disque, en insérant toutes sortes de valeurs de configuration, notamment ENV{UDISKS_PRESENTATION_HIDE}="1" pour ignorer un disque pour une raison quelconque. Voir "man 7 udisks" pour plus de détails.
  7. Le disks-daemon recherche les périphériques à apparaître dans la base de données dev et les présente sous la forme d'une liste de périphériques détectables sur DBus. (Voir "udisks --enumerate".)
  8. Diverses actions sont configurées dans disks, et la politique permettant d'autoriser ces actions est visible dans le fichier de règles /usr/share/polkit-1/actions/org.freedesktop.udisks.policy. (Qui peut monter, monter, etc.)
  9. Les services intéressés par les périphériques écouteront les événements DBus de disks et prendront des mesures s’ils détectent certaines conditions. Par exemple, Nautilus de GNOME (via gvfs volume-monitor) demandera le montage automatique des périphériques (via disks, qui vérifiera sa politique, mentionnée ci-dessus).
  10. Une fois qu'un système de fichiers a été monté, ces mêmes services d'écoute entreprendront plus d'actions. Par exemple, Nautilus vous demandera si vous souhaitez ouvrir F-Spot lorsque le répertoire de stockage de photos commun DCIM se trouve sur un système de fichiers.
16
Kees Cook