Cuando lo uso, lsusb
me doy cuenta de que el número de bus y el número de dispositivo de un dispositivo USB pueden cambiar de vez en cuando. Por lo que entiendo, el número de bus se puede cambiar en cada reinicio. El número de dispositivo cambiará en cada reconexión.
Mi pregunta es qué algoritmo utilizó el sistema para obtener el número de bus y el número de dispositivo. Especialmente el número de dispositivo, ¿es monótono? ¿Alguna vez habrá un caso en el que: sin reiniciar el sistema operativo, un dispositivo reconectado está usando el número de bus y el número de dispositivo antiguo de otro dispositivo reconectado?
Respuestas:
Nota: Esta es una respuesta de Linux ; otros núcleos tendrán una forma ligeramente diferente de lidiar con esto.
Contexto
Es difícil hablar de buses USB sin hablar de buses PCI. Una CPU no puede hablar con un bus USB, lo que sucede es que la CPU habla con un bus PCI que tiene un controlador USB conectado (y un controlador / hub USB es lo que
lsusb
llama un bus USB). Los buses PCI están numerados en función de qué tan lejos están de la CPU, por ejemplo:Mirando hacia adentro
man lspci
vemos lo siguiente:Por lo tanto, ahora sabemos cómo interpretar los números PCI. A continuación, veremos los controladores USB conectados a los buses PCI. La máquina en la que estoy actualmente tiene una configuración USB interesante, así que la usaré como ejemplo:
Espera espera espera, ¿cuáles son todas esas ventajas? En la parte superior tenemos el dominio y el bus PCI
-[0000:00]
(esta máquina solo tiene un bus PCI). Y luego tenemos varios dispositivos conectados a ese bus. Veamos cuáles son dispositivos USB:Bien, ahora comparemos eso con
lsusb
(lo usosort
solo para facilitar la búsqueda en la lista más adelante):Espera otra vez. Tenemos 7 dispositivos USB según
lspci
pero 10 dispositivos segúnlsusb
!lspci
solo enumera los controladores USB; Un controlador puede tener más de un dispositivo USB conectado. Exploremos/sys/bus/
para ver cómo sucede esto.Ahora esto está comenzando a tener sentido, tenemos 7 controladores USB que están conectados en el bus PCI como dispositivos. Por ejemplo, el bus USB 001 corresponde al dispositivo PCI
0000:00:12.2
y el bus USB 007 corresponde al0000:00:14.5
dispositivo.Numeración del dispositivo
Los directorios que comienzan con el número de bus USB (p
7-1:1.2
. Ej. ) Son los dispositivos reales conectados al controlador USB. Al igual que un bus PCI puede tener varios dispositivos conectados, un controlador USB (un concentrador) puede tener varios dispositivos USB conectados.Los números de dispositivo son simplemente contadores: el primer dispositivo conectado obtiene un 1, el siguiente obtiene un 2, y así sucesivamente. Pero hay un poco más: USB fue diseñado para ser conectable en caliente; por lo tanto, puede conectar y desconectar dispositivos. Cuando desconecte un dispositivo USB, el núcleo no volverá a utilizar el número de dispositivo para ningún otro dispositivo en ese controlador USB. Por ejemplo, si conecta y desconecta un pen drive y sigue haciéndolo
lsusb
, verá el número de dispositivo de su pen drive subiendo.Numeración de bus
Si ha leído lo anterior con atención, es posible que se pregunte sobre una cosa que no toqué. ¡El orden de numeración de PCI no corresponde al orden en que se numeraron los controladores USB! Veamos eso de nuevo:
La lista está en orden, pero no del todo. Los primeros dos controladores USB parecen estar fuera de servicio. Sin embargo, hay una razón por la cual: si observa
lspci
arriba, verá que sonEHCI
USB (USB 2.0), mientras que todos los demás controladoresOHCI
USB son USB (USB 1.x).Por lo tanto, podemos volver a dibujar esta tabla como:
Y la asignación de números se vuelve clara.
fuente
001
, sino que el núcleo está reutilizando el número de dispositivo más grande. ¿Hay una manera fácil de cambiar este comportamiento?udev
comprende más o menos). En cuanto a entender la numeración en aras del aprendizaje, creo que el único lugar que tiene la información es el código del núcleo.