Podczas używania lsusb
zdaję sobie sprawę, że numer magistrali i numer urządzenia USB może się zmieniać od czasu do czasu. Z tego, co rozumiem, numer magistrali można zmienić przy każdym ponownym uruchomieniu. Numer urządzenia zmieni się przy każdym ponownym połączeniu.
Moje pytanie brzmi: jakiego algorytmu system użył do uzyskania numeru magistrali i numeru urządzenia? Zwłaszcza numer urządzenia, czy jest monotoniczny? Czy kiedykolwiek zdarzy się przypadek, że: bez ponownego uruchomienia systemu operacyjnego jedno ponownie podłączone urządzenie używa starego numeru magistrali i numeru innego podłączonego urządzenia?
Odpowiedzi:
Uwaga: To jest odpowiedź na Linuksa ; inne jądra będą miały nieco inny sposób radzenia sobie z tym.
Kontekst
Trudno mówić o magistralach USB bez mówienia o magistralach PCI. Procesor nie może komunikować się z magistralą USB, co się dzieje, gdy procesor komunikuje się z magistralą PCI, do której podłączony jest kontroler USB (a kontroler / koncentrator
lsusb
USB to tak zwana magistrala USB). Magistrale PCI są ponumerowane na podstawie odległości od procesora, na przykład:Przyglądając się
man lspci
, widzimy:Dlatego wiemy już, jak interpretować numery PCI. Następnie przyjrzymy się kontrolerom USB podłączonym do magistrali PCI. Maszyna, na której aktualnie jestem, ma ciekawą konfigurację USB, więc wykorzystam ją jako przykład:
Czekaj, czekaj, czekaj, jakie są wszystkie plusy? Na górze mamy domenę i magistralę PCI
-[0000:00]
(to urządzenie ma tylko jedną magistralę PCI). A potem mamy kilka urządzeń podłączonych do tej magistrali. Zobaczmy, które są urządzeniami USB:Dobrze, teraz porównajmy to
lsusb
(używamsort
tylko, aby ułatwić późniejsze przeszukiwanie listy):Poczekaj jeszcze raz Mamy 7 urządzeń USB według,
lspci
ale 10 urządzeń wedługlsusb
!lspci
wymienia tylko kontrolery USB; do kontrolera może być podłączone więcej niż jedno urządzenie USB. Pozwól nam zbadać,/sys/bus/
jak to się dzieje.Teraz zaczyna to mieć sens, mamy 7 kontrolerów USB, które są podłączone do magistrali PCI jako urządzenia. Na przykład magistrala USB 001 odpowiada urządzeniu PCI,
0000:00:12.2
a magistrala USB 007 odpowiada0000:00:14.5
urządzeniu.Numeracja urządzeń
Katalogi zaczynające się od numeru magistrali USB (np.
7-1:1.2
) Są rzeczywistymi urządzeniami podłączonymi do kontrolera USB. Podobnie jak magistrala PCI może mieć podłączonych kilka urządzeń, kontroler USB (hub) może mieć podłączonych kilka urządzeń USB.Numery urządzeń to po prostu liczniki: pierwsze podłączone urządzenie otrzymuje 1, następne 2 i tak dalej. Ale jest jeszcze coś więcej: USB został zaprojektowany tak, aby można go było podłączać podczas pracy; dlatego możesz podłączać i odłączać urządzenia. Po odłączeniu urządzenia USB numer urządzenia nie będzie ponownie używany przez jądro dla żadnego innego urządzenia na tym kontrolerze USB. Na przykład, jeśli podłączysz i odłączysz pendrive'a i
lsusb
będziesz kontynuować , zobaczysz numer urządzenia dla pendrivea w górę.Numeracja autobusów
Jeśli przeczytałeś powyższe z uwagą, możesz zastanawiać się nad jedną rzeczą, której nie dotknąłem. Kolejność numeracji PCI nie odpowiada kolejności, w której kontrolery USB zostały ponumerowane! Zobaczmy to jeszcze raz:
Lista jest w porządku, ale nie do końca. Pierwsze dwa kontrolery USB wydają się nie działać. Istnieje jednak powód: Jeśli spojrzysz na to
lspci
powyżej, zobaczysz, że są toEHCI
USB (USB 2.0), podczas gdy wszystkie inne kontroleryOHCI
USB to USB (USB 1.x).Dlatego możemy przerysować tę tabelę jako:
Przypisanie liczb staje się jasne.
źródło
001
, zamiast tego jądro ponownie używa największej liczby urządzeń. Czy istnieje prosty sposób na zmianę tego zachowania?udev
mniej więcej rozumie). Aby zrozumieć numerację w celu nauki, uważam, że jedynym miejscem, w którym są informacje, jest kod jądra.