¿Cómo entender el flujo de detección USB?

14

Me gustaría entender el flujo de los eventos USB desde el espacio Kernel al espacio Usuario (solo por curiosidad, al saber cómo se implementan las cosas).

Para ser más claro, me gustaría saber cómo aparece esa ventana emergente en mi escritorio cuando conecto una unidad USB a mi sistema y cómo se monta la unidad.

También me gustaría saber cómo descubre si algunas imágenes están presentes en mi USB y, en caso afirmativo, ¿cómo me pregunta si necesito abrirlo en GIMP o en algún otro software?

Sé que es una pregunta muy grande y amplia, pero por favor guíame con algunos consejos sobre cómo entender toda la idea detrás de esto.

No he hecho exploraciones de código grandes, pero le aseguro que no tengo ningún problema si puedo guiarme correctamente.

Sen
fuente

Respuestas:

16
  1. El dispositivo está enchufado y el software que administra el bus de hardware para ese dispositivo recibe una interrupción (u otra notificación a nivel de hardware), y el controlador del bus enumera los dispositivos conectados o realiza otras acciones de hardware específicas del bus para identificar el dispositivo.
  2. Kernel solicita cargar un controlador para el nuevo hardware llamando a / sbin / modprobe con el identificador de bus / dispositivo / etc. del hardware.
  3. En el espacio de usuario, modprobe intenta encontrar un alias especificado por el controlador que coincida. (Consulte /lib/modules/$(uname -r)/modules.aliasla lista completa). Estos se verán diferentes según la interfaz de hardware. Por ejemplo, pci:v0000102Bd00002527sv*sd*bc*sc*i*para un dispositivo PCI proveedor 102B, dispositivo de 2527, y cualquier cosa por subvendedor, etc, o USB: usb:v2040p4982d*dc*dsc*dp*ic*isc*ip*.
  4. una vez que se carga el controlador del dispositivo (o se inicializa un nuevo dispositivo que ya tenía un controlador), el controlador del núcleo envía una notificación del dispositivo cargado al udevespacio de usuario.
  5. udevhace coincidir la notificación con su lista de reglas en /lib/udev/rules.d/y /etc/udev/rules.d. A partir de aquí, el comportamiento es extremadamente especializado, basado en las reglas.
  6. En el caso de un disco USB, el 80-udisks.rulesarchivo es probablemente el mejor lugar para trabajar. Estas reglas usarán cosas como blkid y otros ayudantes para sondear el tipo y el contenido de un disco, completando todo tipo de valores de configuración, incluyendo cosas como ENV{UDISKS_PRESENTATION_HIDE}="1"ignorar un disco por alguna razón. Ver "hombre 7 udiscos" para más detalles.
  7. El udisks-daemon busca dispositivos para que aparezcan en la base de datos udev , y los presenta como una lista reconocible de dispositivos a través de DBus. (Ver "udiscos --enumerar".)
  8. Se configuran varias acciones en udiscos , y la política para permitir esas acciones se puede ver en el archivo de políticas /usr/share/polkit-1/actions/org.freedesktop.udisks.policy. (¿Quién puede montar, desmontar, etc.)
  9. Los servicios que están interesados ​​en los dispositivos escucharán los eventos DBus desde los udiscos y tomarán medidas cuando vean ciertas condiciones. Por ejemplo, Nautilus de GNOME (a través del monitor de volumen gvfs) solicitará el montaje automático para dispositivos (a través de udisks , que verificará su política, mencionada anteriormente).
  10. Una vez que se ha montado un sistema de archivos, esos mismos servicios de escucha tomarán más medidas. Por ejemplo, Nautilus le preguntará si desea abrir F-Spot cuando el directorio común de almacenamiento de fotos DCIMse encuentra en un sistema de archivos.
Kees Cook
fuente
1
¿Quizás sabe cómo esto difiere durante el arranque (supongo que solo el paso 1 es diferente)? ¿Por qué no se puede detectar un dispositivo durante el arranque, sino que se carga correctamente después de la desconexión manual?
naktinis