Wie kann man den Fluss der USB-Erkennung verstehen?

14

Ich möchte den Fluss der USB-Ereignisse vom Kernel-Space zum User-Space verstehen (nur aus Neugier, wenn ich weiß, wie Dinge implementiert werden).

Um es klarer zu machen, möchte ich wissen, wie dieses Popup auf meinem Desktop angezeigt wird, wenn ich ein USB-Laufwerk an mein System anschließe und wie das Laufwerk bereitgestellt wird.

Ich möchte auch wissen, wie festgestellt wird, ob Bilder auf meinem USB-Stick vorhanden sind, und wenn "Ja", wie ich gefragt werde, ob ich ihn in GIMP oder einer anderen Software öffnen muss.

Ich weiß, es ist eine sehr große und weite Frage, aber bitte geben Sie mir einige Hinweise, wie ich die gesamte Idee dahinter verstehen kann.

Ich habe keine großen Code-Browsings durchgeführt, aber ich versichere Ihnen, dass ich kein Problem damit habe, wenn ich richtig geführt werden kann.

Sen
quelle

Antworten:

16
  1. Das Gerät ist angeschlossen, und die Software, die den Hardwarebus für dieses Gerät verwaltet, empfängt eine Unterbrechung (oder eine andere Benachrichtigung auf Hardwareebene), und der Bustreiber zählt die angeschlossenen Geräte auf oder führt andere busspezifische Hardwareaktionen durch, um das Gerät zu identifizieren.
  2. Der Kernel fordert an, einen Treiber für die neue Hardware zu laden, indem er / sbin / modprobe mit der Hardware- ID bus / device / etc aufruft .
  3. Im User-Space versucht modprobe , einen passenden, vom Treiber angegebenen Alias ​​zu finden. (Eine /lib/modules/$(uname -r)/modules.aliasvollständige Liste finden Sie unter.) Diese sehen je nach Hardware-Schnittstelle unterschiedlich aus. Zum Beispiel pci:v0000102Bd00002527sv*sd*bc*sc*i*für einen PCI - Gerätehersteller 102B Gerät 2527, und alles für Subvendor usw. oder USB: usb:v2040p4982d*dc*dsc*dp*ic*isc*ip*.
  4. Sobald der Gerätetreiber geladen ist (oder ein neues Gerät, auf dem bereits ein Treiber initialisiert wurde), sendet der Treiber im Kernel eine Benachrichtigung über das geladene Gerät an den Benutzer udev.
  5. udevvergleicht die Benachrichtigung mit der Liste der Regeln in /lib/udev/rules.d/und /etc/udev/rules.d. Von hier aus ist das Verhalten sehr spezialisiert, basierend auf den Regeln.
  6. Im Falle eines USB-Datenträgers ist die 80-udisks.rulesDatei wahrscheinlich der beste Ort, an dem Sie arbeiten können. Diese Regeln verwenden Dinge wie blkid und andere Hilfsprogramme , um den Typ und den Inhalt eines Datenträgers zu untersuchen. Dabei werden alle Arten von Konfigurationswerten angegeben, einschließlich solcherENV{UDISKS_PRESENTATION_HIDE}="1" , die einen Datenträger aus irgendeinem Grund ignorieren. Siehe "man 7 udisks" für Details.
  7. Der udisks-Daemon überwacht, ob Geräte in der udev- Datenbank angezeigt werden, und zeigt sie als erkennbare Liste von Geräten über DBus an. (Siehe "udisks --enumerate".)
  8. In udisks sind verschiedene Aktionen konfiguriert , und die Richtlinie zum Zulassen dieser Aktionen kann in der Richtliniendatei eingesehen werden /usr/share/polkit-1/actions/org.freedesktop.udisks.policy. (Wer kann montieren, ummontieren, etc.)
  9. Dienste, die an Geräten interessiert sind, warten auf DBus-Ereignisse von Udisks und ergreifen Maßnahmen, wenn sie bestimmte Bedingungen sehen. Beispielsweise fordert Nautilus von GNOME (über gvfs volume-monitor) die automatische Bereitstellung von Geräten an (über udisks , die die oben genannten Richtlinien überprüfen).
  10. Sobald ein Dateisystem gemountet wurde, führen dieselben Abhördienste weitere Aktionen aus. Zum Beispiel fragt Nautilus, ob Sie F-Spot öffnen möchten, wenn das gemeinsame Fotospeicherverzeichnis DCIMin einem Dateisystem gefunden wird.
Kees Cook
quelle
1
Vielleicht wissen Sie, wie sich dies beim Booten unterscheidet (ich gehe davon aus, dass nur Schritt 1 anders ist)? Warum konnte ein Gerät beim Booten nicht erkannt, aber nach manuellem Umstecken korrekt geladen werden?
Naktinis