LINUX

Cómo comprobar si un kernel de Linux es compatible con los dispositivos de mi sistema

En este artículo, demostraré un ejemplo práctico que ilustra cómo el kernel admite un dispositivo y sus controladores.

Busque el nombre del dispositivo de red

Los siguientes son los nombres asociado con dispositivos de red. Nota: lo es el nombre del dispositivo de bucle invertido, no está conectado a ninguno de los dispositivos de red.

bobbin@linoxide:~$ ls /sys/class/net/
eth0 eth1 lo
bobbin@linoxide:~$

Encuentra el dispositivo adjunto a los nombres anteriores

Puede ver que eth0 está configurado con dirección Ip y activo con valores RX / TX. Está usando marcos estándar con un tamaño de 1500 MTU.

bobbin@linoxide:~$ ifconfig -a
eth0 Link encap:Ethernet HWaddr 08:00:27:1d:20:09
inet addr:10.0.3.17 Bcast:10.0.3.255 Mask:255.255.255.0
inet6 addr: fe80::a00:27ff:fe1d:2009/64 Scope:Link
UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1
RX packets:124 errors:0 dropped:0 overruns:0 frame:0
TX packets:177 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:1000
RX bytes:33456 (33.4 KB) TX bytes:19854 (19.8 KB)

eth1 Link encap:Ethernet HWaddr 08:00:27:e7:1d:7f
inet6 addr: fe80::a00:27ff:fee7:1d7f/64 Scope:Link
UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1
RX packets:0 errors:0 dropped:0 overruns:0 frame:0
TX packets:0 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:1000
RX bytes:0 (0.0 B) TX bytes:0 (0.0 B)

lo Link encap:Local Loopback
inet addr:127.0.0.1 Mask:255.0.0.0
inet6 addr: ::1/128 Scope:Host
UP LOOPBACK RUNNING MTU:65536 Metric:1
RX packets:100 errors:0 dropped:0 overruns:0 frame:0
TX packets:100 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:0
RX bytes:7864 (7.8 KB) TX bytes:7864 (7.8 KB)

bobbin@linoxide:~$

Encuentra qué módulo admite eth0

Cuales conductor está controlando el dispositivo eth0? El siguiente resultado muestra que el controlador e1000 está controlando el eth0 tarjeta de red.

bobbin@linoxide:/$ ls /sys/class/net/eth0/device/driver/module/drivers/
pci:e1000
bobbin@linoxide:/$

Encuentre el dispositivo PCI ethernet conectado al servidor

Como puede ver en el siguiente resultado, hay dos tarjetas de red Intel en el servidor con revisión 02.Los primeros bits de la salida del comando lspci muestran el ID del bus PCI para este dispositivo, es decir, 00: 03.0 y 00: 08.0

bobbin@linoxide:~$ lspci | grep -i Ethernet
00:03.0 Ethernet controller: Intel Corporation 82540EM Gigabit Ethernet Controller (rev 02)
00:08.0 Ethernet controller: Intel Corporation 82540EM Gigabit Ethernet Controller (rev 02)
bobbin@linoxide:~$

Vaya a / sys / bus / pci / devices / donde se enumeran todos los dispositivos PCI diferentes,

bobbin@linoxide:~$ cd /sys/bus/pci/devices/
bobbin@linoxide:/sys/bus/pci/devices$ ls
0000:00:00.0 0000:00:02.0 0000:00:05.0 0000:00:08.0
0000:00:01.0 0000:00:03.0 0000:00:06.0 0000:00:0d.0
0000:00:01.1 0000:00:04.0 0000:00:07.0
bobbin@linoxide:/sys/bus/pci/devices$

El kernel enumera los dispositivos PCI con un 0000: que no aparece en la salida del programa lspci. Así que agregue el 0000: inicial al número que encontró usando lspci y vaya a ese directorio.

bobbin@linoxide:/sys/bus/pci/devices$ cd 0000:00:03.0
bobbin@linoxide:/sys/bus/pci/devices/0000:00:03.0$ ls
broken_parity_status driver net resource2
class enable power subsystem
config irq remove subsystem_device
consistent_dma_mask_bits local_cpulist rescan subsystem_vendor
d3cold_allowed local_cpus reset uevent
device modalias resource vendor
dma_mask_bits msi_bus resource0
bobbin@linoxide:/sys/bus/pci/devices/0000:00:03.0$

En este directorio, puede encontrar los nombres de archivo del proveedor y del dispositivo

bobbin@linoxide:/sys/bus/pci/devices/0000:00:03.0$ cat vendor
0x8086
bobbin@linoxide:/sys/bus/pci/devices/0000:00:03.0$ cat device
0x100e
bobbin@linoxide:/sys/bus/pci/devices/0000:00:03.0$

El kernel usa estos valores para hacer coincidir un controlador con un dispositivo correctamente. Los controladores PCI le dicen al kernel qué proveedores y ID de dispositivo admitirán para que el kernel sepa cómo vincular el controlador al dispositivo adecuado.

Encuentre lo que el kernel y el controlador son compatibles

Busque en el archivo fuente del kernel para vendedor y ID del dispositivo

bobbin@linoxide:/usr/src/linux-headers-3.8.0-29$ grep -i 0x8086 include/linux/pci_ids.h
#define PCI_VENDOR_ID_INTEL 0x8086
bobbin@linoxide:/usr/src/linux-headers-3.8.0-29$
bobbin@linoxide:/usr/src/linux-headers-3.8.0-29$ grep -i 0x100e include/linux/pci_ids.h
#define 0x100e
bobbin@linoxide:/usr/src/linux-headers-3.8.0-29$

Ahora busque en los archivos de origen del controlador «PCI_VENDOR_ID_INTEL». Ahora debe buscar el archivo C en cuestión para el controlador y buscar dentro del archivo

bobbin@linoxide:/usr/src/linux-source-3.2.0/drivers/net$ grep -Rl PCI_VENDOR_ID_INTEL *
can/pch_can.c
ethernet/dec/tulip/tulip_core.c
ethernet/oki-semi/pch_gbe/pch_gbe_main.c
ethernet/broadcom/tg3.c
ethernet/intel/e100.c
ethernet/intel/e1000/e1000_main.c
ethernet/intel/e1000/e1000.h
irda/smsc-ircc2.c
wireless/iwlegacy/iwl-core.h
wireless/iwlwifi/iwl-pci.c
wireless/ipw2x00/ipw2100.c
wireless/ipw2x00/ipw2200.c
wireless/rtlwifi/pci.c
bobbin@linoxide:/usr/src/linux-source-3.2.0/drivers/net$
bobbin@linoxide:/usr/src/linux-source-3.2.0/drivers/net/ethernet/intel$ cat e1000_main.c | more
* {PCI_DEVICE(PCI_VENDOR_ID_INTEL, device_id)}
*/
static DEFINE_PCI_DEVICE_TABLE(e1000_pci_tbl) = {
INTEL_E1000_ETHERNET_DEVICE(0x1000),
INTEL_E1000_ETHERNET_DEVICE(0x1001),
INTEL_E1000_ETHERNET_DEVICE(0x1004),
INTEL_E1000_ETHERNET_DEVICE(0x1008),
INTEL_E1000_ETHERNET_DEVICE(0x1009),
INTEL_E1000_ETHERNET_DEVICE(0x100C),
INTEL_E1000_ETHERNET_DEVICE(0x100D),
INTEL_E1000_ETHERNET_DEVICE(0x100E),
INTEL_E1000_ETHERNET_DEVICE(0x100F),
INTEL_E1000_ETHERNET_DEVICE(0x1010),
INTEL_E1000_ETHERNET_DEVICE(0x1011),
INTEL_E1000_ETHERNET_DEVICE(0x1012),
INTEL_E1000_ETHERNET_DEVICE(0x1013),
INTEL_E1000_ETHERNET_DEVICE(0x1014),

Todos los controladores PCI contienen lista de los diferentes dispositivos que admiten. La lista está contenida en una definición estática en la tabla DEFINE_PCI_DEVICE_TABLE, como esta. Eso es lo que debemos observar para determinar si nuestro dispositivo es compatible con este controlador. En nuestro caso, el valor del proveedor y la identificación del dispositivo partido , por lo que este controlador será compatible con nuestro dispositivo.

Publicaciones relacionadas

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *

Botón volver arriba
Cerrar