Quando uso lsusb
, percebo que o número do barramento e o número do dispositivo de um dispositivo USB podem mudar de tempos em tempos. Pelo que entendi, o número do barramento pode ser alterado a cada reinicialização. O número do dispositivo será alterado a cada reconexão.
Minha pergunta é qual algoritmo o sistema usou para obter o número do barramento e o número do dispositivo? Especialmente o número do dispositivo, é monotônico? Alguma vez haverá um caso em que: sem reiniciar o sistema operacional, um dispositivo reconectado está usando o número do barramento e o número do dispositivo antigo de outro dispositivo reconectado?
Respostas:
Nota: Esta é uma resposta do Linux ; outros kernels terão uma maneira ligeiramente diferente de lidar com isso.
Contexto
É difícil falar sobre barramentos USB sem falar sobre barramentos PCI. Uma CPU não pode falar com um barramento USB, o que acontece é que a CPU conversa com um barramento PCI que possui um controlador USB conectado a ela (e um controlador / hub USB é o que
lsusb
chama de barramento USB). Os barramentos PCI são numerados com base na distância da CPU, por exemplo:Observando
man lspci
, vemos o seguinte:Portanto, agora sabemos como interpretar números PCI. A seguir, veremos os controladores USB conectados aos barramentos PCI. A máquina em que estou atualmente possui uma configuração USB interessante, então vou usá-la como exemplo:
Espere, espere, espere, quais são todas essas vantagens? No topo, temos o domínio e o barramento PCI
-[0000:00]
(esta máquina possui apenas um barramento PCI). E então temos vários dispositivos conectados a esse barramento. Vamos ver quais são os dispositivos USB:Bom, agora vamos comparar isso
lsusb
(eu usosort
apenas para facilitar a pesquisa na lista posteriormente):Aguarde de novo. Temos 7 dispositivos USB de acordo com,
lspci
mas 10 dispositivos de acordo comlsusb
!lspci
lista apenas os controladores USB; um controlador pode ter mais de um dispositivo USB conectado a ele. Vamos explorar/sys/bus/
para ver como isso acontece.Agora, isso está começando a fazer sentido, temos 7 controladores USB conectados ao barramento PCI como dispositivos. Por exemplo, o barramento USB 001 corresponde ao dispositivo PCI
0000:00:12.2
e o barramento USB 007 corresponde ao0000:00:14.5
dispositivo.Numeração do dispositivo
Os diretórios que começam com o número do barramento USB (por exemplo
7-1:1.2
) são os dispositivos reais conectados ao controlador USB. Assim como um barramento PCI pode ter vários dispositivos conectados, um controlador USB (um hub) pode ter vários dispositivos USB conectados a ele.Os números dos dispositivos são simplesmente contadores: o primeiro dispositivo conectado recebe 1, o próximo recebe 2 e assim por diante. Mas há um pouco mais: o USB foi projetado para ser plugável a quente; portanto, você pode conectar e desconectar dispositivos. Quando você desconecta um dispositivo USB, o número do dispositivo não será usado novamente pelo kernel para nenhum outro dispositivo nesse controlador USB. Por exemplo, se você conectar e desconectar um pen drive e continuar fazendo
lsusb
, verá o número do dispositivo do seu pen drive subindo.Numeração de barramento
Se você leu o texto acima com atenção, pode estar se perguntando sobre uma coisa que eu não toquei. A ordem da numeração PCI não corresponde à ordem em que os controladores USB foram numerados! Vamos ver isso de novo:
A lista está em ordem, mas não completamente. Os dois primeiros controladores USB parecem estar fora de ordem. No entanto, há uma razão para: Se você examinar
lspci
acima, verá que eles sãoEHCI
USB (USB 2.0), enquanto todos os outros controladoresOHCI
USB são USB (USB 1.x).Portanto, podemos redesenhar esta tabela como:
E a atribuição de números fica clara.
fonte
001
, mas o kernel está reutilizando o maior número de dispositivos. Existe uma maneira fácil de mudar esse comportamento?udev
mais ou menos). Para entender a numeração em prol da aprendizagem, acredito que o único local que possui essa informação é o código do kernel.