Як присвоєно номер шини USB та номер пристрою?


19

Під час використання lsusbя розумію, що номер шини та номер пристрою USB-пристрою час від часу можуть змінюватися. Як я розумію, номер шини можна змінити при кожному перезавантаженні. Номер пристрою змінюватиметься під час кожного підключення.

Моє запитання - який алгоритм використовувала система для отримання номера шини та номера пристрою? Особливо номер пристрою, це монотонно? Чи буде колись такий випадок, що: не перезавантажуючи ОС, один підключений пристрій використовує старий номер шини та номер пристрою іншого відновленого пристрою?


6
Одне з мене викликало цікавість у вашому запитанні, чи дійсно ви бачили, як змінилися номери BUS після перезавантаження? Я завжди був впевнений, що, якщо ви не заміните обладнання або не оновите BIOS, номери BUS не зміниться. Шини USB - це просто концентратори / контролери, підключені до шин PCI (у всіх випадках я бачив щонайменше), а інформація про шину PCI надходить від BIOS. Але я можу помилятися, не хочу відповідати і говорити в лайні.
grochmal

правильно, лише тоді, коли у мене є зміна обладнання.
Конан

Відповіді:


23

Примітка. Це відповідь Linux ; інші ядра матимуть дещо інший спосіб впоратися з цим.

Контекст

Про USB-шини важко говорити, не кажучи про шини PCI. Процесор не може розмовляти з шиною USB, що трапляється в тому, що процесор розмовляє з шиною PCI, до якої підключений USB-контролер (а USB-контролер / концентратор - це те, що lsusbвикликає шину USB). Шини PCI нумеруються залежно від того, наскільки вони віддалені від ЦП, наприклад:

    +-----+
    | CPU |
    +-----+
       |              PCI Bus 0
 ---+--+-----------------------------+
    |                                |
+---+----+                      +----+---+
| Bridge |                      | Bridge |
+---+----+                      +----+---+
    |  PCI bus 1                     |  PCI bus 2
  --+--------+               +-------+-------------+
             |               |                     |
       Disk Controller    USB Controller      Network Card
         (Device 00)       (Device 00)         (Device 01)

Заглядаючи, man lspciми бачимо наступне:

   Slot   The  name of the slot where the device resides
          ([domain:]bus:device.function).  This tag is
          always the first in a record.

Тому тепер ми знаємо, як інтерпретувати номери PCI. Далі ми розглянемо USB-контролери, підключені до шин PCI. Машина, на якій я зараз перебуваю, має цікаву конфігурацію USB, тому я буду використовувати її як приклад:

$ lspci -tv
-[0000:00]-+-00.0  Advanced Micro Devices, Inc. [AMD] RS780 Host Bridge
           +-01.0-[01]----05.0  Advanced Micro Devices, Inc. [AMD/ATI] RS780M [Mobility Radeon HD 3200]
           +-04.0-[02]----00.0  Qualcomm Atheros AR928X Wireless Network Adapter (PCI-Express)
           +-05.0-[03]----00.0  Realtek Semiconductor Co., Ltd. RTL8111/8168/8411 PCI Express Gigabit Ethernet Controller
           +-06.0-[04-06]--
           +-11.0  Advanced Micro Devices, Inc. [AMD/ATI] SB7x0/SB8x0/SB9x0 SATA Controller [IDE mode]
           +-12.0  Advanced Micro Devices, Inc. [AMD/ATI] SB7x0/SB8x0/SB9x0 USB OHCI0 Controller
           +-12.1  Advanced Micro Devices, Inc. [AMD/ATI] SB7x0 USB OHCI1 Controller
           +-12.2  Advanced Micro Devices, Inc. [AMD/ATI] SB7x0/SB8x0/SB9x0 USB EHCI Controller
           +-13.0  Advanced Micro Devices, Inc. [AMD/ATI] SB7x0/SB8x0/SB9x0 USB OHCI0 Controller
           +-13.1  Advanced Micro Devices, Inc. [AMD/ATI] SB7x0 USB OHCI1 Controller
           +-13.2  Advanced Micro Devices, Inc. [AMD/ATI] SB7x0/SB8x0/SB9x0 USB EHCI Controller
           +-14.0  Advanced Micro Devices, Inc. [AMD/ATI] SBx00 SMBus Controller
           +-14.1  Advanced Micro Devices, Inc. [AMD/ATI] SB7x0/SB8x0/SB9x0 IDE Controller
           +-14.2  Advanced Micro Devices, Inc. [AMD/ATI] SBx00 Azalia (Intel HDA)
           +-14.3  Advanced Micro Devices, Inc. [AMD/ATI] SB7x0/SB8x0/SB9x0 LPC host controller
           +-14.4-[07]--
           +-14.5  Advanced Micro Devices, Inc. [AMD/ATI] SB7x0/SB8x0/SB9x0 USB OHCI2 Controller
           +-18.0  Advanced Micro Devices, Inc. [AMD] Family 11h Processor HyperTransport Configuration
           +-18.1  Advanced Micro Devices, Inc. [AMD] Family 11h Processor Address Map
           +-18.2  Advanced Micro Devices, Inc. [AMD] Family 11h Processor DRAM Controller
           +-18.3  Advanced Micro Devices, Inc. [AMD] Family 11h Processor Miscellaneous Control
           \-18.4  Advanced Micro Devices, Inc. [AMD] Family 11h Processor Link Control

Зачекайте, чекайте, чекайте, які всі ці плюси? У верхній частині у нас є домен і шина PCI -[0000:00](ця машина має лише одну шину PCI). І тоді у нас є кілька пристроїв, підключених до цієї шини. Давайте подивимося, які з USB-пристроїв:

$ lspci -tv | grep -i usb
       +-12.0  Advanced Micro Devices, Inc. [AMD/ATI] SB7x0/SB8x0/SB9x0 USB OHCI0 Controller
       +-12.1  Advanced Micro Devices, Inc. [AMD/ATI] SB7x0 USB OHCI1 Controller
       +-12.2  Advanced Micro Devices, Inc. [AMD/ATI] SB7x0/SB8x0/SB9x0 USB EHCI Controller
       +-13.0  Advanced Micro Devices, Inc. [AMD/ATI] SB7x0/SB8x0/SB9x0 USB OHCI0 Controller
       +-13.1  Advanced Micro Devices, Inc. [AMD/ATI] SB7x0 USB OHCI1 Controller
       +-13.2  Advanced Micro Devices, Inc. [AMD/ATI] SB7x0/SB8x0/SB9x0 USB EHCI Controller
       +-14.5  Advanced Micro Devices, Inc. [AMD/ATI] SB7x0/SB8x0/SB9x0 USB OHCI2 Controller

Добре, тепер порівняємо це проти lsusb(я використовую sortлише для полегшення пошуку списку пізніше):

$ lsusb | sort
Bus 001 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub
Bus 002 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub
Bus 002 Device 002: ID 174f:5a31 Syntek Sonix USB 2.0 Camera
Bus 003 Device 001: ID 1d6b:0001 Linux Foundation 1.1 root hub
Bus 003 Device 002: ID 046d:c019 Logitech, Inc. Optical Tilt Wheel Mouse
Bus 004 Device 001: ID 1d6b:0001 Linux Foundation 1.1 root hub
Bus 005 Device 001: ID 1d6b:0001 Linux Foundation 1.1 root hub
Bus 006 Device 001: ID 1d6b:0001 Linux Foundation 1.1 root hub
Bus 007 Device 001: ID 1d6b:0001 Linux Foundation 1.1 root hub
Bus 007 Device 002: ID 0b05:1751 ASUSTek Computer, Inc. BT-253 Bluetooth Adapter

Зачекайте ще раз. У нас є 7 пристроїв USB згідно, lspciале 10 пристроїв відповідно до lsusb! lspciперелічує лише USB-контролери; контролер може мати більше одного USB-пристрою. Давайте дослідимо, /sys/bus/щоб побачити, як це відбувається.

$ ls -l /sys/bus/usb/devices/
... 1-0:1.0 -> ../../../devices/pci0000:00/0000:00:12.2/usb1/1-0:1.0
... 2-0:1.0 -> ../../../devices/pci0000:00/0000:00:13.2/usb2/2-0:1.0
... 2-1 -> ../../../devices/pci0000:00/0000:00:13.2/usb2/2-1
... 2-1:1.0 -> ../../../devices/pci0000:00/0000:00:13.2/usb2/2-1/2-1:1.0
... 2-1:1.1 -> ../../../devices/pci0000:00/0000:00:13.2/usb2/2-1/2-1:1.1
... 3-0:1.0 -> ../../../devices/pci0000:00/0000:00:12.0/usb3/3-0:1.0
... 3-1 -> ../../../devices/pci0000:00/0000:00:12.0/usb3/3-1
... 3-1:1.0 -> ../../../devices/pci0000:00/0000:00:12.0/usb3/3-1/3-1:1.0
... 4-0:1.0 -> ../../../devices/pci0000:00/0000:00:12.1/usb4/4-0:1.0
... 5-0:1.0 -> ../../../devices/pci0000:00/0000:00:13.0/usb5/5-0:1.0
... 6-0:1.0 -> ../../../devices/pci0000:00/0000:00:13.1/usb6/6-0:1.0
... 7-0:1.0 -> ../../../devices/pci0000:00/0000:00:14.5/usb7/7-0:1.0
... 7-1 -> ../../../devices/pci0000:00/0000:00:14.5/usb7/7-1
... 7-1:1.0 -> ../../../devices/pci0000:00/0000:00:14.5/usb7/7-1/7-1:1.0
... 7-1:1.1 -> ../../../devices/pci0000:00/0000:00:14.5/usb7/7-1/7-1:1.1
... 7-1:1.2 -> ../../../devices/pci0000:00/0000:00:14.5/usb7/7-1/7-1:1.2
... 7-1:1.3 -> ../../../devices/pci0000:00/0000:00:14.5/usb7/7-1/7-1:1.3
... usb1 -> ../../../devices/pci0000:00/0000:00:12.2/usb1
... usb2 -> ../../../devices/pci0000:00/0000:00:13.2/usb2
... usb3 -> ../../../devices/pci0000:00/0000:00:12.0/usb3
... usb4 -> ../../../devices/pci0000:00/0000:00:12.1/usb4
... usb5 -> ../../../devices/pci0000:00/0000:00:13.0/usb5
... usb6 -> ../../../devices/pci0000:00/0000:00:13.1/usb6
... usb7 -> ../../../devices/pci0000:00/0000:00:14.5/usb7

Тепер це починає мати сенс, у нас є 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  | PCI
-----+----
usb1 | 0000:00/0000:00:12.2
usb2 | 0000:00/0000:00:13.2
usb3 | 0000:00/0000:00:12.0
usb4 | 0000:00/0000:00:12.1
usb5 | 0000:00/0000:00:13.0
usb6 | 0000:00/0000:00:13.1
usb7 | 0000:00/0000:00:14.5

Список в порядку, але не зовсім. Перші два USB-контролери, здається, вийшли з ладу. Тим не менш, є причина, чому: Якщо ви подивитесь lspciвище, ви побачите, що це EHCIUSB (USB 2.0), а всі інші USB-контролери - OHCIUSB (USB 1.x).

Тому ми можемо переробити цю таблицю так:

USB  | PCI
-----+----
usb1 | 0000:00/0000:00:12.2
usb2 | 0000:00/0000:00:13.2     USB 2.0
-----+---------------------------------
usb3 | 0000:00/0000:00:12.0     USB 1.x
usb4 | 0000:00/0000:00:12.1
usb5 | 0000:00/0000:00:13.0
usb6 | 0000:00/0000:00:13.1
usb7 | 0000:00/0000:00:14.5

І присвоєння числа стає зрозумілим.


так що буде, коли буде використана максимальна кількість пристрою. скажімо, я продовжую знову підключати свій пристрій. Номер пристрою незабаром перейде до макс. Я насправді зробив тест, схоже, це не простий лічильник. Він не повертається назад 001, натомість ядро ​​повторно використовує найбільший номер пристрою. Чи є простий спосіб змінити таку поведінку?
Конан

@Conan - Хм ... ну, як я можу це сказати: я просто не знаю. Я ніколи не намагався переповнювати лічильник пристроїв, як ви. Знову ж таки, навряд чи потрібно заздалегідь знати номер пристрою. Наприклад, якщо ви намагаєтеся знайти USB-накопичувач під час підключення, вам слід зробити це за допомогою ярлика файлової системи або UUID (що навіть udevбільш-менш розуміє). Щодо розуміння нумерації заради навчання, я вважаю, що єдиним місцем, де є інформація, є код ядра.
grochmal

Дякую @grochmal, я думаю, що я помилився, коли тест переповнюється. Пізніші тести показали мені при переповненні, лічильник дійсно шукав із нижчого числа.
Конан
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.