Comment comprendre le flux de détection USB?

14

Je voudrais comprendre le flux des événements USB de l'espace noyau vers l'espace utilisateur (juste par curiosité, pour savoir comment les choses sont implémentées).

Pour être plus clair, j'aimerais savoir comment ce pop-up apparaît sur mon bureau lorsque je branche un lecteur USB sur mon système et comment le lecteur est monté.

Je voudrais aussi savoir comment il découvre si certaines images sont présentes dans mon USB et si "oui", comment il me demande si je dois l'ouvrir dans GIMP ou dans un autre logiciel?

Je sais que c'est une question très vaste et large, mais veuillez me guider avec quelques conseils sur la façon de comprendre toute l'idée derrière.

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

Sen
la source

Réponses:

16
  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 connectés, ou effectue d'autres actions matérielles spécifiques au bus pour identifier le périphérique.
  2. Le noyau demande de charger un pilote pour le nouveau matériel en appelant / sbin / modprobe avec l'identifiant bus / périphérique / etc du matériel.
  3. Dans l'espace utilisateur, modprobe essaie de trouver un alias spécifié par le pilote correspondant. (Voir /lib/modules/$(uname -r)/modules.aliaspour la liste complète.) Ceux-ci seront différents selon l'interface matérielle. Par exemple, pci:v0000102Bd00002527sv*sd*bc*sc*i*pour un périphérique PCI fournisseur 102B, dispositif 2527, et quoi que ce soit pour subvendor, etc, ou USB: usb:v2040p4982d*dc*dsc*dp*ic*isc*ip*.
  4. une fois que le pilote de périphérique est chargé (ou qu'un nouveau périphérique qui avait déjà un pilote est initialisé), le pilote dans le noyau envoie une notification du périphérique chargé à udevdans l'espace utilisateur.
  5. udevfait correspondre la notification à sa liste de règles dans /lib/udev/rules.d/et /etc/udev/rules.d. De là, le comportement est extrêmement spécialisé, basé sur les règles.
  6. Dans le cas d'un disque USB, le 80-udisks.rulesfichier est probablement le meilleur endroit pour travailler. Ces règles utiliseront des choses comme blkid et d'autres aides pour sonder le type et le contenu d'un disque, en remplissant toutes sortes de valeurs de configuration, y compris des choses comme ENV{UDISKS_PRESENTATION_HIDE}="1"ignorer un disque pour une raison quelconque. Voir "udisks man 7" pour plus de détails.
  7. Le démon udisks recherche les périphériques à apparaître dans la base de données udev et les présente comme une liste de périphériques détectables sur DBus. (Voir "udisks --enumerate".)
  8. Diverses actions sont configurées dans les udisks , et la politique permettant d'autoriser ces actions peut être vue dans le fichier de politique /usr/share/polkit-1/actions/org.freedesktop.udisks.policy. (Qui peut monter, démonter, etc.)
  9. Les services intéressés par les appareils écoutent les événements DBus à partir des udisks et prennent des mesures lorsqu'ils voient certaines conditions. Par exemple, Nautilus de GNOME (via gvfs volume-monitor) demandera un montage automatique pour les périphériques (via udisks , 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 prendront plus d'actions. Par exemple, Nautilus vous demandera si vous souhaitez ouvrir F-Spot lorsque le répertoire de stockage de photos commun DCIMse trouve sur un système de fichiers.
Kees Cook
la source
1
Peut-être savez-vous comment cela diffère lors du démarrage (je suppose que seule l'étape 1 est différente)? Pourquoi un périphérique ne peut-il pas être détecté au démarrage, mais se charger correctement après une re-connexion manuelle?
naktinis