Hasta ahora, hemos estado hablando bastante sobre las interfaces de red pero sin explicar realmente qué es lo que pasa cuando el “código de red” del núcleo accede a una parte del hardware. Para ello, y antes que nada, tenemos que hablar un poco sobre los conceptos de interfaz y controladores.
Primero, evidentemente, está el hardware por sí mismo; por ejemplo, una tarjeta Ethernet, FDDI o Token Ring: es una oblea de silicio, atiborrada de montones de pequeños chips con extraños números encima e insertada en una ranura de su PC. Esto es lo que por lo general denominamos un dispositivo físico.
Para poder utilizar una tarjeta de red son necesarias una serie de funciones especiales definidas en el núcleo de Linux que seran capaces de entender la forma particular de acceso al dispositivo. Al software que implementa estas funciones se le llama controlador(N. del T.: Con frecuencia, la bibliografía especializada en español también los llama manejadores o drivers). Linux tiene controladores para muchos tipos de tarjetas de red: ISA, PCI, MCA, EISA, puerto paralelo, PCMCIA, y más recientemente, USB.
¿Pero qué es lo que queremos decir con que un controlador “gestione” un dispositivo? Vamos a tratar sobre esto con una tarjeta Ethernet. El controlador tiene que ser capaz de comunicarse de alguna forma con la lógica interna de la tarjeta: tiene que enviar órdenes y datos a la tarjeta, mientras que la tarjeta debe transmitir al controlador cualquier dato recibido.
En un PC compatible, esta comunicación se establece por medio de una serie de direcciones de E/S que son mapeadas a los registros de la tarjeta y/o a través de transferencias directas o compartidas a memoria. Todos las órdenes y datos que el núcleo envía a la tarjeta tienen que ir a estas direcciones. Las direcciones de memoria y E/S son obtenidas generalmente por medio del arranque o de las direcciones base. Las direcciones base típicas para las tarjetas Ethernet por bus ISA son 0x280 o 0x300. Las tarjetas de red por bus PCI generalmente ya tienen asignada automáticamente su dirección de E/S.
Normalmente no hay que preocuparse por asuntos de hardware como las direcciones base porque al arrancar el núcleo intenta detectar la localización de la tarjeta. Esto es llamado autoverificación (N. del T.: Del inglés autoprobe), que significa que el núcleo lee varias posiciones de memoria y compara los datos que ha encontrado con los que esperaría ver si una tarjeta de red en concreto estuviese instalada en esa posición. De todas maneras, puede haber tarjetas de red que no puedan ser detectadas automáticamente; esto ocurre a veces con tarjetas de red baratas que no son réplicas exactas de tarjetas estándar de otros fabricantes. Por otro lado, el núcleo intentará detectar solamente un único dispositivo de red al arrancar. Si está usando más de una tarjeta, tendrá que informar al núcleo de las otras tarjetas explícitamente.
[1] Otro de los parámetros del que puede tener que informar al núcleo es la línea de petición de interrupción. Los componentes hardware normalmente interrumpen al núcleo cuando tienen la necesidad de que éste se ocupe de ellos, por ejemplo, cuando han llegado datos o se presenta una condición especial. En un bus ISA, las interrupciones pueden ocurrir en uno de los 15 canales de interrupción numerados asi: 0, 1, y del 3 al 15. Al número de interrupción asignado a un componente hardware se le denomina número de petición de interrupción (IRQ)..[2]
Como se describe en Capítulo 2, el núcleo accede a un dispositivo mediante lo que llamamos un interfaz. Los interfaces ofrecen un conjunto abstracto de funciones que es el mismo para todo tipo de hardware. Por ejemplo, las funciones para enviar o recibir datagramas.
Los interfaces se identifican por medio de nombres. En muchos sistemas operativos tipo Unix, el interfaz de red se implementa como un fichero de dispositivo especial en el directorio /dev/. Si usted teclea la orden ls -las /dev/, verá como aparecen sus ficheros de dispositivos. En la columna de permisos de los ficheros (segunda) verá que los ficheros de dispositivos comienzan con una letra en vez del guión visto con los ficheros normales. Este carácter indica el tipo de dispositivo. Los tipos de dispositivos más comunes son los b, que indica que es un dispositivo de bloque y maneja grandes bloques de datos cada vez que lee y escribe, y c, que indica que el dispositivo es un dispositvo de carácter y maneja datos de un solo carácter cada vez. Donde normalmente desearía ver el tamaño del fichero en la salida de ls, en vez de eso verá dos números, llamados los números de dispositivo "major" y "minor" (primario y secundario). Estos números indican el dispositivo actual al que está asociado el fichero de dispositivo.
Cada controlador de dispositivo registra un unico número primario para el núcleo. En cada caso los registros de dispositivos tienen un único número secundario para dicho dispositivo primario. Los interfaces tty, /dev/tty*, son unos dispositivos de modo carácter por lo que indica la “c”, y tienen un maximo número de 4, pero /dev/tty1 tiene un número menor de 1, y /dev/tty2 tiene un número menor de 2. Los ficheros de dispositivos son muy útiles para muchos tipos de dispositivos, pero pueden ser pesados de usar cuando intentamos encontrar un dispositivo sin usar para abrir.
Los nombres de las interfaces de Linux son definidos internamente en el núcleo y no son ficheros de dispositivos del directorio /dev. Algunos nombres de dispositivos típicos serán listados después en Sección 3.2.” La asignación de interfaces a los dispositivos depende normalmente del orden en que los dispositivos son configurados. Por ejemplo, la primera tarjeta Ethernet instalada será eth0, la siguiente eth1, y así sucesivamente. Las interfaces SLIP son manejadas de forma diferente a otras porque éstas son asignadas dinámicamente. Cuando se establece una conexion SLIP, una interfaz es asignada al puerto serie.
Figura 3-1 Ilustra la relación entre el hardware, los controladores de dispositivos, y las interfaces.
Al arrancar, el núcleo muestra los dispositivos detectados y las interfaces que instala. Lo siguiente es un extracto de la pantalla de arranque:
. . This processor honors the WP bit even when in supervisor mode./ Good. Swansea University Computer Society NET3.035 for Linux 2.0 NET3: Unix domain sockets 0.13 for Linux NET3.035. Swansea University Computer Society TCP/IP for NET3.034 IP Protocols: IGMP,ICMP, UDP, TCP Swansea University Computer Society IPX 0.34 for NET3.035 IPX Portions Copyright (c) 1995 Caldera, Inc. Serial driver version 4.13 with no serial options enabled tty00 at 0x03f8 (irq = 4) is a 16550A tty01 at 0x02f8 (irq = 3) is a 16550A CSLIP: code copyright 1989 Regents of the University of California PPP: Version 2.2.0 (dynamic channel allocation) PPP Dynamic channel allocation code copyright 1995 Caldera, Inc. PPP line discipline registered. eth0: 3c509 at 0x300 tag 1, 10baseT port, address 00 a0 24 0e e4 e0,/ IRQ 10. 3c509.c:1.12 6/4/97 becker@cesdis.gsfc.nasa.gov Linux Version 2.0.32 (root@perf) (gcc Version 2.7.2.1) #1 Tue Oct 21 15:30:44 EST 1997 . . |
Este ejemplo muestra que el núcleo ha sido compilado con el TCP/IP activado e incluyendo controladores para SLIP, CSLIP, y PPP. La tercera línea empezando desde abajo muestra que una tarjeta Ethernet 3C509 ha sido detectada e instalada como la interfaz eth0. Si tiene algún otro tipo de tarjeta de red; quizás un adaptador de bolsillo D-Link, por ejemplo—el núcleo normalmente mostrará una línea que empieza con el nombre del dispositivo—dl0 en el caso del ejemplo del D-Link—seguido por el tipo de tarjeta detectada. Si tiene una tarjeta de red instalada pero no aparece ningún mensaje similar significa que el núcleo es incapaz de detectar su tarjeta correctamente. Esta situación será tratada más adelante en la sección“Ethernet Autoprobing.”
[1] | N. del T.: Del inglés Interrupt ReQuest |
[2] | Las IRQs 2 y 9 son las mismas porque el diseño del IBM PC tiene 2 procesadores de interrupciones en cascada con 8 IRQs cada uno, el procesador secundario es conectado a la IRQ 2 del primario. |