Como entender o fluxo de detecção USB?

14

Gostaria de entender o fluxo dos eventos USB do espaço do Kernel para o espaço do Usuário (por curiosidade, por saber como as coisas são implementadas).

Para ser mais claro, eu gostaria de saber como esse pop-up aparece na minha área de trabalho quando conecto uma unidade USB ao meu sistema e como a unidade é montada.

Também gostaria de saber como descobrir se algumas imagens estão presentes no meu USB e se "sim", como me pergunta se preciso abri-lo no GIMP ou em algum outro software?

Eu sei que é uma pergunta muito grande e abrangente, mas por favor, me guie com algumas dicas sobre como entender toda a ideia por trás disso.

Não fiz grandes navegações de código, mas garanto que não tenho nenhum problema em fazê-lo, se puder ser orientado corretamente.

Sen
fonte

Respostas:

16
  1. O dispositivo está conectado e o software que gerencia o barramento de hardware para ele recebe uma interrupção (ou outra notificação no nível do hardware) e o driver do barramento enumera os dispositivos conectados ou executa outras ações de hardware específicas do barramento para identificar o dispositivo.
  2. O kernel solicita o carregamento de um driver para o novo hardware chamando / sbin / modprobe com o identificador de barramento / dispositivo / etc do hardware.
  3. No espaço do usuário, o modprobe tenta encontrar um alias especificado pelo driver correspondente. (Veja /lib/modules/$(uname -r)/modules.aliasa lista completa.) Elas parecerão diferentes com base na interface do hardware. Por exemplo, pci:v0000102Bd00002527sv*sd*bc*sc*i*para um dispositivo PCI fornecedor 102B, dispositivo 2527, e qualquer coisa para subvendor, etc, ou USB: usb:v2040p4982d*dc*dsc*dp*ic*isc*ip*.
  4. depois que o driver do dispositivo é carregado (ou um novo dispositivo que já possui um driver é inicializado), o driver no kernel envia uma notificação do dispositivo carregado para o udevespaço do usuário.
  5. udevcombina a notificação com sua lista de regras em /lib/udev/rules.d/e /etc/udev/rules.d. A partir daqui, o comportamento é extremamente especializado, com base nas regras.
  6. No caso de um disco USB, o 80-udisks.rulesarquivo é provavelmente o melhor local para se trabalhar. Essas regras usarão coisas como blkid e outros auxiliares para analisar o tipo e o conteúdo de um disco, preenchendo todos os tipos de valores de configuração, incluindo coisas como ENV{UDISKS_PRESENTATION_HIDE}="1"ignorar um disco por algum motivo. Veja "man 7 udisks" para detalhes.
  7. O udisks-daemon observa a exibição de dispositivos no banco de dados udev e os apresenta como uma lista detectável de dispositivos no DBus. (Consulte "udisks --enumerate".)
  8. Várias ações são configuradas em udisks , e a política para permitir essas ações pode ser vista no arquivo de políticas /usr/share/polkit-1/actions/org.freedesktop.udisks.policy. (Quem pode montar, montar, etc.)
  9. Os serviços interessados ​​em dispositivos escutam os eventos DBus dos udisks e executam ações quando veem determinadas condições. Por exemplo, o Nautilus do GNOME (via gvfs volume-monitor) solicitará a montagem automática de dispositivos (via udisks , que verificará sua política, mencionada acima).
  10. Depois que um sistema de arquivos é montado, esses mesmos serviços de escuta executam mais ações. Por exemplo, o Nautilus perguntará se você deseja abrir o F-Spot quando o diretório comum de armazenamento de fotos DCIMfor encontrado em um sistema de arquivos.
Kees Cook
fonte
1
Talvez você saiba como isso difere durante a inicialização (presumo que apenas a etapa 1 seja diferente)? Por que um dispositivo não pôde ser detectado durante a inicialização, mas carregado corretamente após a substituição manual?
naktinis