Làm thế nào số xe buýt USB và số thiết bị được chỉ định?


19

Khi sử dụng, lsusbtôi nhận ra rằng số xe buýt và số thiết bị của thiết bị USB có thể thay đổi theo thời gian. Theo những gì tôi hiểu, số xe buýt có thể được thay đổi trên mỗi lần khởi động lại. Số thiết bị sẽ thay đổi trên mỗi kết nối lại.

Câu hỏi của tôi là thuật toán nào hệ thống sử dụng để lấy số xe buýt và số thiết bị? Đặc biệt là số thiết bị, nó có đơn điệu không? Sẽ có trường hợp nào: không khởi động lại HĐH, một thiết bị được kết nối lại đang sử dụng số xe buýt cũ và số thiết bị được kết nối lại?


6
Một điều khiến tôi tò mò về câu hỏi của bạn, bạn có thực sự thấy số xe buýt thay đổi sau khi khởi động lại không? Tôi luôn tự tin rằng trừ khi bạn thay đổi phần cứng hoặc cập nhật BIOS, các số BUS sẽ không thay đổi. Bus USB chỉ đơn giản là trung tâm / bộ điều khiển được kết nối với bus PCI (trong mọi trường hợp tôi thấy ít nhất) và thông tin về bus PCI đến từ BIOS. Nhưng tôi có thể sai, đừng muốn trả lời và nói chuyện tào lao trong đó.
hóa học

đúng, chỉ khi tôi thay đổi phần cứng trông như thế nào.
Conan

Câu trả lời:


23

Lưu ý: Đây là câu trả lời của Linux ; các hạt nhân khác sẽ có một cách hơi khác để đối phó với điều này.

Bối cảnh

Thật khó để nói về xe buýt USB mà không nói về xe buýt PCI. CPU không thể nói chuyện với bus USB, điều xảy ra là CPU nói chuyện với bus PCI có bộ điều khiển USB được kết nối với nó (và bộ điều khiển / hub USB là thứ lsusbgọi là bus USB). Các bus PCI được đánh số dựa trên khoảng cách từ CPU, ví dụ:

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

Nhìn vào man lspcichúng tôi thấy như sau:

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

Vì vậy, bây giờ chúng ta biết làm thế nào để giải thích số PCI. Tiếp theo chúng ta sẽ xem xét các bộ điều khiển USB được kết nối với các bus PCI. Máy tôi hiện đang có cấu hình USB thú vị nên tôi sẽ sử dụng nó làm ví dụ:

$ 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

Chờ đợi chờ đợi, tất cả những điểm cộng là gì? Ở đầu chúng ta có miền và bus PCI -[0000:00](máy này chỉ có một bus PCI). Và sau đó chúng tôi có một số thiết bị kết nối với xe buýt đó. Hãy xem những thiết bị USB nào:

$ 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

Tốt, bây giờ chúng ta hãy so sánh với điều đó lsusb(tôi sortchỉ sử dụng để làm cho việc tìm kiếm danh sách sau này dễ dàng hơn):

$ 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

Chờ đợi một lần nữa. Chúng tôi có 7 thiết bị USB theo lspcinhưng 10 thiết bị theo lsusb! lspcichỉ liệt kê các bộ điều khiển USB; một bộ điều khiển có thể có nhiều thiết bị USB được gắn vào nó. Hãy để chúng tôi khám phá /sys/bus/để xem làm thế nào điều này xảy ra.

$ 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

Bây giờ điều này đã bắt đầu có ý nghĩa, chúng tôi có 7 bộ điều khiển USB được cắm vào bus PCI dưới dạng thiết bị. Ví dụ: USB bus 001 tương ứng với thiết bị PCI 0000:00:12.2và USB bus 007 tương ứng với 0000:00:14.5thiết bị.

Đánh số thiết bị

Các thư mục bắt đầu bằng số bus USB (ví dụ 7-1:1.2) là các thiết bị thực tế được kết nối với bộ điều khiển USB. Giống như bus PCI có thể có một số thiết bị được kết nối với bộ điều khiển USB (bộ tập trung) có thể có một số thiết bị USB được kết nối với nó.

Số thiết bị chỉ đơn giản là bộ đếm: thiết bị đầu tiên được kết nối có 1, tiếp theo được 2, v.v. Nhưng có một chút nữa: USB được thiết kế để cắm nóng; do đó bạn có thể kết nối và ngắt kết nối thiết bị. Khi bạn ngắt kết nối thiết bị USB, số thiết bị sẽ không được sử dụng lại bởi nhân cho bất kỳ thiết bị nào khác trên bộ điều khiển USB đó. Ví dụ: nếu bạn kết nối và ngắt kết nối ổ bút và tiếp tục làm, lsusbbạn sẽ thấy số thiết bị cho ổ bút của mình tăng lên.

Đánh số xe buýt

Nếu bạn đã đọc những điều trên với sự chú ý, bạn có thể tự hỏi về một điều mà tôi đã không chạm vào. Thứ tự đánh số PCI không tương ứng với thứ tự các bộ điều khiển USB được đánh số! Chúng ta hãy xem điều đó một lần nữa:

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

Danh sách theo thứ tự, nhưng không hoàn toàn. Hai bộ điều khiển USB đầu tiên dường như không còn hoạt động. Tuy nhiên, có một lý do tại sao: Nếu bạn nhìn vào lspcibên trên, bạn sẽ thấy đó là EHCIUSB (USB 2.0), trong khi tất cả các bộ điều khiển USB khác là OHCIUSB (USB 1.x).

Do đó, chúng ta có thể vẽ lại bảng này như sau:

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

Và việc gán số trở nên rõ ràng.


Vì vậy, những gì sẽ xảy ra khi số lượng thiết bị tối đa được sử dụng. giả sử tôi tiếp tục kết nối lại thiết bị của mình Số thiết bị sẽ sớm đi đến tối đa. Tôi thực sự đã làm một bài kiểm tra, có vẻ như nó không phải là một bộ đếm đơn giản. Nó không quay trở lại 001, thay vào đó, kernel đang sử dụng lại số thiết bị lớn nhất. Có một cách dễ dàng để thay đổi hành vi này?
Conan

@Conan - Hmm ... tốt, làm sao tôi có thể nói: Tôi chỉ không biết. Tôi không bao giờ cố gắng để tràn bộ đếm thiết bị như bạn đã làm. Sau đó, một lần nữa, hầu như không cần biết trước một số thiết bị. Ví dụ: nếu bạn đang cố gắng tìm một ổ USB khi nó kết nối, bạn nên thực hiện nó bằng nhãn hệ thống tập tin hoặc UUID (điều này thậm chí udevít nhiều hiểu được). Để hiểu việc đánh số vì mục đích học tập, tôi tin rằng nơi duy nhất có thông tin là mã hạt nhân.
hóa dầu

Cảm ơn bạn @grochmal, tôi nghĩ rằng tôi đã mắc lỗi khi kiểm tra tràn. Các thử nghiệm sau đó cho tôi thấy khi tràn, bộ đếm thực sự tìm kiếm từ số thấp hơn.
Conan
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.