사용하면서 lsusb
USB 장치의 버스 번호와 장치 번호가 수시로 변경될 수 있다는 것을 발견했습니다. 내가 아는 바로는 재부팅할 때마다 버스 번호가 변경됩니다. 다시 연결할 때마다 장치 번호가 변경됩니다.
내 질문은 시스템이 버스 번호와 장치 번호를 얻기 위해 어떤 알고리즘을 사용하는가입니다. 특히 기기번호가 단조롭나요? 다시 연결된 장치 중 하나가 운영 체제를 다시 시작하지 않고 다시 연결된 다른 장치의 이전 버스 번호와 장치 번호를 사용하는 상황이 있습니까?
답변1
참고: 이것은리눅스답변; 다른 커널은 이 문제를 약간 다르게 처리합니다.
문맥:
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 버스가 하나만 있습니다). 그러면 이 버스에 여러 장치가 연결되어 있습니다. 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
잠시만 기다려주세요. USB 장치는 7개인데 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 컨트롤러가 제대로 작동하지 않는 것 같습니다. 그러나 여기에는 이유가 있습니다. 위의 출력을 자세히 살펴보면 USB(USB 2.0)인 반면 다른 모든 USB 컨트롤러는 USB(USB 1.x) 임을 lspci
알 수 있습니다 .EHCI
OHCI
따라서 테이블을 다음과 같이 다시 그릴 수 있습니다.
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
그리고 번호 할당이 명확해집니다!