USB बस नंबर और डिवाइस नंबर कैसे असाइन किया गया है?


19

जब lsusbमैं उपयोग करता हूं तो मुझे पता चलता है कि यूएसबी डिवाइस का बस नंबर और डिवाइस नंबर समय-समय पर बदल सकता है। जो मैं समझता हूं, बस नंबर हर रिबूट पर बदल सकता है। डिवाइस का नंबर हर रीकनेक्ट पर बदल जाएगा।

मेरा सवाल यह है कि बस नंबर और डिवाइस नंबर प्राप्त करने के लिए उपयोग की जाने वाली प्रणाली क्या एल्गोरिदम है? विशेष रूप से डिवाइस नंबर, क्या यह मोनोटोनिक है? क्या कभी ऐसा कोई मामला होगा जो: ओएस को रिबूट किए बिना, एक पुन: कनेक्टेड डिवाइस किसी अन्य पुन: कनेक्टेड डिवाइस के पुराने बस नंबर और डिवाइस नंबर का उपयोग कर रहा हो?


6
एक बात ने मुझे आपके प्रश्न के बारे में जानने के लिए उत्सुक कर दिया, क्या आपने रिबूट के बाद वास्तव में बस नंबरों को बदल दिया है? मुझे हमेशा भरोसा था कि जब तक आप हार्डवेयर नहीं बदलते या BIOS को अपडेट नहीं करेंगे, तब तक बस नंबर नहीं बदलेगा। USB बस PCI हब से जुड़े हब / कंट्रोलर हैं (सभी मामलों में मैंने कम से कम देखा है), और PCI बस की जानकारी BIOS से आती है। लेकिन मैं गलत हो सकता हूं, जवाब नहीं देना चाहता और इसमें बकवास बात कर सकता हूं।
grochmal

सही है, केवल जब मेरे पास हार्डवेयर परिवर्तन होता है, जैसा दिखता है।
कॉनन

जवाबों:


23

नोट: यह एक लिनक्स उत्तर है; अन्य गुठली से निपटने के लिए थोड़ा अलग तरीका होगा।

प्रसंग

PCI बसों के बारे में बात किए बिना USB बसों के बारे में बात करना मुश्किल है। CPU USB बस से बात नहीं कर सकता है, ऐसा क्या होता है कि CPU एक PCI बस से बात करता है जिसमें USB नियंत्रक जुड़ा होता है (और USB नियंत्रक / हब जिसे lsusbUSB बस कहते हैं)। पीसीआई की बसों को उदाहरण के लिए, सीपीयू से कितनी दूर के आधार पर गिना जाता है:

    +-----+
    | 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.

इसलिए अब हम जानते हैं कि पीसीआई नंबर की व्याख्या कैसे करें। अगला हम पीसीआई बसों से जुड़े यूएसबी नियंत्रकों को देखेंगे। वर्तमान में मैं जिस मशीन पर हूं, उसमें एक दिलचस्प यूएसबी कॉन्फ़िगरेशन है, इसलिए मैं इसे एक उदाहरण के रूप में उपयोग करूंगा:

$ 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

रुको रुको रुको, ये सभी प्लसस क्या हैं? शीर्ष पर हमारे पास डोमेन और पीसीआई बस है -[0000:00](इस मशीन में केवल एक पीसीआई बस है)। और फिर हमारे पास उस बस से जुड़े कई उपकरण हैं। आइए देखें कि कौन से हैं यूएसबी डिवाइस:

$ 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 नियंत्रक से जुड़े वास्तविक उपकरण हैं। जैसे पीसीआई बस में कई डिवाइस हो सकते हैं, वैसे ही यूएसबी कंट्रोलर (हब) से जुड़े कई यूएसबी डिवाइस हो सकते हैं।

डिवाइस नंबर बस काउंटर हैं: पहले जुड़े डिवाइस को 1 मिलता है, अगले को 2 मिलता है, और इसी तरह। लेकिन थोड़ा और है: यूएसबी को गर्म-प्लगबेल होने के लिए डिज़ाइन किया गया था; इसलिए आप डिवाइस कनेक्ट और डिस्कनेक्ट कर सकते हैं। जब आप USB डिवाइस को डिस्कनेक्ट करते हैं तो डिवाइस नंबर उस USB नियंत्रक पर किसी अन्य डिवाइस के लिए फिर से कर्नेल द्वारा उपयोग नहीं किया जाएगा। उदाहरण के लिए, यदि आप एक पेन ड्राइव को कनेक्ट करते हैं और डिस्कनेक्ट करते हैं, तो आप lsusbअपनी पेन ड्राइव के लिए डिवाइस नंबर देखेंगे।

बस नंबरिंग

यदि आपने ध्यान से ऊपर पढ़ा है तो आप एक बात के बारे में सोच रहे होंगे कि मैंने नहीं छुआ। पीसीआई क्रमांकन का क्रम उस क्रम के अनुरूप नहीं है जिसमें यूएसबी नियंत्रक क्रमांकित थे! आइए हम फिर से देखें:

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, इसके बजाय कर्नेल सबसे बड़ी डिवाइस संख्या का पुन: उपयोग कर रहा है। क्या इस व्यवहार को बदलने का एक आसान तरीका है?
कॉनन

@ कोंन - हम्म ... अच्छा, मैं इसे कैसे कह सकता हूं: मुझे अभी पता नहीं है। मैंने कभी भी डिवाइस काउंटर को ओवरफ्लो करने की कोशिश नहीं की जैसा आपने किया। फिर, पहले से डिवाइस नंबर जानने की शायद ही जरूरत हो। उदाहरण के लिए, यदि आप एक USB ड्राइव को खोजने की कोशिश कर रहे हैं जब यह जोड़ता है कि आपको इसे फाइलसिस्टम लेबल या UUID द्वारा करना चाहिए (जो कि udevऔर भी -या-कम समझता है)। सीखने की खातिर नंबरिंग को समझने के लिए, मेरा मानना ​​है कि एकमात्र स्थान जिसमें जानकारी है वह कर्नेल कोड है।

शुक्रिया @grochmal, मुझे लगता है कि मैंने परीक्षा में गलती की है। बाद के परीक्षणों ने मुझे दिखाया जब अतिप्रवाह, काउंटर वास्तव में कम संख्या से खोज कर रहा था।
कॉनन
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.