Lors de l'utilisation, lsusb
je me rends compte que le numéro de bus et le numéro de périphérique d'un périphérique USB peuvent changer de temps en temps. D'après ce que je comprends, le numéro de bus peut être changé à chaque redémarrage. Le numéro d'appareil change à chaque reconnexion.
Ma question est quel algorithme le système a utilisé pour obtenir le numéro de bus et le numéro de périphérique? Surtout le numéro d'appareil, est-il monotone? Y aura-t-il un cas où: sans redémarrer le système d'exploitation, un périphérique reconnecté utilise l'ancien numéro de bus et le numéro de périphérique d'un autre périphérique reconnecté?
Réponses:
Remarque: il s'agit d'une réponse Linux ; les autres noyaux auront une manière légèrement différente de gérer cela.
Le contexte
Il est difficile de parler de bus USB sans parler de bus PCI. Un CPU ne peut pas parler à un bus USB, ce qui se passe est que le CPU parle à un bus PCI auquel est connecté un contrôleur USB (et un contrôleur / concentrateur USB est ce qu'on
lsusb
appelle un bus USB). Les bus PCI sont numérotés en fonction de leur distance par rapport au CPU, par exemple:En regardant,
man lspci
nous voyons ce qui suit:Par conséquent, nous savons maintenant comment interpréter les numéros PCI. Ensuite, nous examinerons les contrôleurs USB connectés aux bus PCI. La machine sur laquelle je suis actuellement a une configuration USB intéressante, je vais donc l'utiliser comme exemple:
Attendez, attendez, quels sont tous ces avantages? En haut, nous avons le domaine et le bus PCI
-[0000:00]
(cette machine n'a qu'un seul bus PCI). Et puis nous avons plusieurs appareils connectés à ce bus. Voyons quels sont les périphériques USB:Bon, comparons maintenant cela
lsusb
(j'utilisesort
juste pour faciliter la recherche dans la liste plus tard):Attends encore. Nous avons 7 appareils USB selon
lspci
mais 10 appareils selonlsusb
!lspci
répertorie uniquement les contrôleurs USB; un contrôleur peut avoir plusieurs périphériques USB connectés. Explorons/sys/bus/
pour voir comment cela se produit.Maintenant, cela commence à avoir un sens, nous avons 7 contrôleurs USB qui sont branchés sur le bus PCI en tant que périphériques. Par exemple, le bus USB 001 correspond au périphérique PCI
0000:00:12.2
et le bus USB 007 correspond au0000:00:14.5
périphérique.Numérotation des appareils
Les répertoires commençant par le numéro de bus USB (par exemple
7-1:1.2
) sont les périphériques réels connectés au contrôleur USB. Tout comme un bus PCI peut avoir plusieurs périphériques connectés, un contrôleur USB (un concentrateur) peut avoir plusieurs périphériques USB connectés.Les numéros d'appareil sont simplement des compteurs: le premier appareil connecté obtient un 1, le suivant obtient un 2, etc. Mais il y a un peu plus: l'USB a été conçu pour être enfichable à chaud; vous pouvez donc connecter et déconnecter des appareils. Lorsque vous déconnectez un périphérique USB, le numéro de périphérique ne sera plus utilisé par le noyau pour tout autre périphérique sur ce contrôleur USB. Par exemple, si vous connectez et déconnectez une clé USB et continuez,
lsusb
vous verrez le numéro de périphérique de votre clé USB augmenter.Numérotation des bus
Si vous avez lu ce qui précède avec attention, vous vous demandez peut-être une chose que je n'ai pas touchée. L'ordre de numérotation PCI ne correspond pas à l'ordre de numérotation des contrôleurs USB! Voyons cela à nouveau:
La liste est en ordre, mais pas tout à fait. Les deux premiers contrôleurs USB semblent être hors service. Pourtant, il y a une raison: si vous regardez
lspci
ci-dessus, vous verrez que ce sont desEHCI
ports USB (USB 2.0), tandis que tous les autres contrôleursOHCI
USB sont USB (USB 1.x).Par conséquent, nous pouvons redessiner ce tableau comme:
Et l'attribution des numéros devient claire.
la source
001
, mais le noyau réutilise le plus grand nombre de périphériques. Existe-t-il un moyen simple de modifier ce comportement?udev
plus ou moins compris). Quant à comprendre la numérotation dans un souci d'apprentissage, je pense que le seul endroit qui contient les informations est le code du noyau.