При использовании lsusb
я понимаю, что номер шины и номер устройства USB могут время от времени меняться. Из того, что я понимаю, номер шины можно менять при каждой перезагрузке. Номер устройства будет меняться при каждом переподключении.
У меня вопрос, какой алгоритм используется системой для получения номера шины и номера устройства? Особенно номер устройства, это монотонный? Будет ли когда-нибудь случай, когда: без перезагрузки ОС одно переподключенное устройство использует старый номер шины другого переподключенного устройства и номер устройства?
Ответы:
Примечание: это ответ Linux ; другие ядра будут иметь немного другой способ справиться с этим.
контекст
Трудно говорить о шинах USB, не говоря о шинах PCI. Процессор не может подключиться к шине USB, в результате процессор взаимодействует с шиной PCI, к которой подключен контроллер USB (а контроллер / концентратор USB - это то, что
lsusb
вызывает шину USB). Шины PCI нумеруются в зависимости от того, как далеко они находятся от процессора, например:Заглядывая в
man lspci
мы видим следующее:Поэтому теперь мы знаем, как интерпретировать числа PCI. Далее мы рассмотрим контроллеры USB, подключенные к шинам PCI. Машина, на которой я сейчас работаю, имеет интересную конфигурацию USB, поэтому я буду использовать ее в качестве примера:
Подожди, подожди, подожди, что это за плюсы? Вверху у нас есть домен и шина PCI
-[0000:00]
(у этой машины только одна шина PCI). И затем у нас есть несколько устройств, подключенных к этой шине. Давайте посмотрим, какие устройства USB:Хорошо, теперь давайте сравним это с
lsusb
(я используюsort
только для упрощения поиска в списке позже):Подожди еще раз. У нас есть 7 USB-устройств в соответствии с
lspci
10 устройств в соответствии сlsusb
!lspci
только списки контроллеров USB; К контроллеру может быть подключено более одного USB-устройства. Давайте/sys/bus/
посмотрим, как это происходит.Теперь это начинает иметь смысл, у нас есть 7 USB-контроллеров, которые подключены к шине PCI как устройства. Например, шина USB 001 соответствует устройству PCI,
0000:00:12.2
а шина USB 007 соответствует0000:00:14.5
устройству.Нумерация устройств
Каталоги, начинающиеся с номера шины USB (например
7-1:1.2
), являются фактическими устройствами, подключенными к контроллеру USB. Точно так же, как к шине PCI может быть подключено несколько устройств, к контроллеру USB (концентратору) может быть подключено несколько USB-устройств.Номера устройств - просто счетчики: первое подключенное устройство получает 1, следующее получает 2 и так далее. Но есть еще немного: USB был разработан для горячей замены; поэтому вы можете подключать и отключать устройства. Когда вы отключаете устройство USB, номер устройства больше не будет использоваться ядром для любого другого устройства на этом контроллере USB. Например, если вы подключите и отключите перьевой диск и продолжите работу,
lsusb
вы увидите, что номер устройства для вашего перьевого диска увеличивается.Нумерация автобусов
Если вы внимательно прочитали вышеизложенное, возможно, вы удивляетесь одной вещи, которой я не коснулся. Порядок нумерации PCI не соответствует порядку нумерации контроллеров USB! Давайте посмотрим, что еще раз:
Список в порядке, но не совсем. Первые два контроллера USB, похоже, вышли из строя. Тем не менее, есть причина, почему: если вы посмотрите
lspci
выше, вы увидите, что этоEHCI
USB (USB 2.0), в то время как все остальные контроллерыOHCI
USB - USB (USB 1.x).Поэтому мы можем перерисовать эту таблицу как:
И назначение номера становится понятным.
источник
001
, вместо этого ядро повторно использует самый большой номер устройства. Есть ли простой способ изменить это поведение?udev
более-менее понятно). Что касается понимания нумерации ради обучения, я считаю, что единственное место, где есть информация, - это код ядра.