使用するときlsusb
、USBデバイスのバス番号とデバイス番号は時々変わることがあります。私が理解していることから、バス番号はリブートするたびに変わる可能性があります。デバイス番号は再接続のたびに変わります。
私の質問は、システムがバス番号とデバイス番号を取得するために使用したアルゴリズムです。特にデバイス番号は単調ですか?OSを再起動せずに、1つの再接続されたデバイスが別の再接続されたデバイスの古いバス番号とデバイス番号を使用している場合がありますか?
使用するときlsusb
、USBデバイスのバス番号とデバイス番号は時々変わることがあります。私が理解していることから、バス番号はリブートするたびに変わる可能性があります。デバイス番号は再接続のたびに変わります。
私の質問は、システムがバス番号とデバイス番号を取得するために使用したアルゴリズムです。特にデバイス番号は単調ですか?OSを再起動せずに、1つの再接続されたデバイスが別の再接続されたデバイスの古いバス番号とデバイス番号を使用している場合がありますか?
回答:
注:これはLinuxの回答です。他のカーネルでは、これに対処する方法が少し異なります。
PCIバスについて話すことなくUSBバスについて話すことは困難です。CPUはUSBバスと通信できません。何が起こるかは、CPUが接続されたUSBコントローラを持つPCIバスと通信することです(USBコントローラ/ハブはlsusb
USBバスと呼ばれます)。PCIバスには、CPUからの距離に基づいて番号が付けられます。次に例を示します。
+-----+
| 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番号の解釈方法がわかりました。次に、PCIバスに接続されたUSBコントローラーを見ていきます。私が現在いるマシンには興味深い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バスが1つしかありません)。そして、そのバスにいくつかのデバイスが接続されています。どのデバイスが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
がありますが、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
これは理にかなっており、デバイスとしてPCIバスに接続されている7つのUSBコントローラーがあります。たとえば、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
リストは整然としていますが、完全ではありません。最初の2つのUSBコントローラーは故障しているようです。しかし、理由は次のlspci
とおりです。上を見ると、それらはEHCI
USB(USB 2.0)であり、他のすべてのUSBコントローラーはOHCI
USB(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
、代わりにカーネルは最大の少数のデバイス番号を再利用しています。この動作を簡単に変更する方法はありますか?
udev
多少は理解できます)で実行する必要があります。学習のために番号付けを理解するために、情報がある唯一の場所はカーネルコードであると信じています。