Un sistema operativo debe trabajar íntimamente con el hardware que le sirve de cimientos. El sistema operativo necesita ciertos servicios que solo pueden suministrar el hardware. Para entender totalmente el sistema operativo Linux, se necesita entender los aspectos básicos del hardware que hay debajo. Este capítulo muestra una breve introducción a dicho hardware: el PC moderno.
Cuando el número de Enero de 1975 de la revista ``Popular Electronics'' salió impreso con una ilustración del Altair 8080 en su portada, comenzó una revolución. El Altair 8080, llamado así por el lugar de destino de uno de los primeros episodios de Star Trek, podía ser ensamblado por entusiastas de la electrónica doméstica por sólo unos $397. Con su procesador Intel 8080 y 256 bytes de memoria, pero sin pantalla ni teclado, era una baratija según los estándares actuales. Su inventor, Ed Roberts, acuñó el término ``computadora personal'' (personal computer) para describir su nuevo invento, pero el término PC se usa ahora para referirse a casi cualquier ordenador que una persona puede levantar del suelo sin necesidad de ayuda. Siguiendo esta definición, incluso algunos de los muy poderosos sistemas Alpha AXP son PCs.
Los hackers entusiastas vieron el potencial del Altair, y comenzaron a escribir software y construir hardware para él. Para esos primeros pioneros representaba libertad; liberarse de los enormes sistemas ``mainframe'' con sus colas de proceso, administrados y protegidos por una élite clerical. Grandes fortunas fueron hechas de la noche a la mañana por gente que abandonaba los estudios fascinados por este nuevo fenómeno, una computadora que se podía tener en casa sobre la mesa de la cocina. Una gran cantidad de hardware estaba apareciendo, cada uno diferente de los demás hasta cierto punto, y los hackers del software estaban felices de escribir software para esas nuevas máquinas. Paradójicamente, fue IBM quien cinceló el molde del PC moderno anunciando el IBM PC en 1981, y sirviéndoselo a los compradores a principios de 1982. Con su procesador Intel 8088, 64K de memoria (expandible a 256K), dos unidades de discos flexibles y un Adaptador de Gráficos en Color (Colour Graphics Adapter - CGA) de 80 caracteres por 25 líneas, no era muy poderoso según los estándares actuales, pero se vendió bien. Fue seguido, en 1983, por el IBM PC-XT, que contaba con el lujo de un disco duro de 10Mbyte. No pasó demasiado tiempo hasta que los clones del IBM PC comenzaron a ser producidos por una hueste de compañías como por ejemplo Compaq, y la arquitectura del PC se convirtió en un estándar de hecho. Este estándar de hecho ayudó a una multitud de empresas de hardware a competir entre ellas en un mercado creciente que, para alegría de los consumidores, mantuvo los precios bajos. Muchas de las características arquitectónicas del sistema de aquellos primitivos PCs se han mantenido hasta llegar al PC moderno. Por ejemplo, incluso el más poderoso sistema basado en el Pentium Pro de Intel arranca en el modo de direccionamiento del Intel 8086. Cuando Linus Torvalds comenzó a escribir lo que se convertiría en Linux, escogió el hardware más completo y de precio más razonable, un PC Intel 80386.
Mirando un PC desde fuera, los componentes más obvios son una caja de sistema, un teclado, un ratón y un monitor de vídeo. En el frente de la caja del sistema hay algunos botones, un pequeño indicador que muestra algunos números y una disquetera. La mayoría de los sistemas actualmente tienen un CD ROM, y si uno siente que debe proteger sus datos, entonces habrá también una unidad de cinta para copias de seguridad. Esos dispositivos se conocen de modo colectivo como periféricos.
Aunque la CPU controla todo el sistema, no es el único dispositivo inteligente. Todos los controladores de periféricos, por ejemplo el controlador IDE, tienen algún nivel de inteligencia. Dentro del PC (Figura 1.1) se puede ver una placa madre que contienen la CPU o microprocesador, la memoria y un número de conectores (slots) para los controladores de periféricos ISA o PCI. Algunos de los controladores, por ejemplo el controlador de disco IDE, pueden estar integrados en la placa del sistema.
Los microprocesadores operan sobre datos binarios; estos son datos compuestos de unos y ceros. Estos unos y ceros corresponden a interruptores eléctricos que están encendidos o apagados. Igual que 42 es un número decimal que significa ``4 decenas y 2 unidades'', un número binario es una serie de dígitos binarios, cada uno representando una potencia de 2. En este contexto, una potencia significa el número de veces que un número es multiplicado por si mismo. 10 elevado a 1 ( 101 ) es 10, 10 elevado a 2 ( 102 ) es 10x10, 103 es 10x10x10 y así sucesivamente. 0001 en binario es 1 en decimal, 0010 en binario es 2 en decimal, 0011 en binario es 3, 0100 en binario es 4, y así sucesivamente. Así, 42 en decimal es 101010 en binario ó (2 + 8 + 32 ó 21 + 23+ 25 ). En vez de usar el binario para representar números en los programas de computadora, otra base, la hexadecimal, es la que se usa normalmente. En esta base, cada dígito representa una potencia de 16. Como los números decimales van sólo de 0 a 9, los números del 10 al 15 se representan con un único dígito usando las letras A, B, C, D, E y F. Por ejemplo, E en hexadecimal es 14 en decimal y 2A en hexadecimal es 42 en decimal ((dos veces 16) + 10). Usando la notación del lenguaje de programación C (como hago a lo largo de este libro) los números hexadecimales llevan el prefijo ``0x''; el hexadecimal 2A se escribe como 0x2A .
Los microprocesadores pueden realizar operaciones aritméticas como sumar, multiplicar y dividir, y operaciones lógicas como ``¿es X mayor que Y?''.
La ejecución del procesador viene gobernada por un reloj externo. Este reloj, el reloj del sistema, envía pulsos de reloj regulares al procesador y, a cada pulso de reloj, el procesador hace algún trabajo. Por ejemplo, un procesador podría ejecutar una instrucción a cada pulso de reloj. La velocidad del procesador se describe en términos de la frecuencia de pulsos del reloj del sistema. Un procesador de 100Mhz recibirá 100 000 000 pulsos de reloj cada segundo. Puede llevar a confusión describir la potencia de una CPU por su frecuencia de reloj ya que diferentes procesadores realizan diferentes cantidades de trabajo a cada pulso de reloj. De todos modos, si el resto de las características son iguales, una mayor velocidad de reloj significa un procesador más potente. Las instrucciones ejecutadas por el procesador son muy simples; por ejemplo ``copia en el registro Y el contenido de la posición X de la memoria''. Los registros son el almacén interno del microprocesador, se usan para almacenar datos y realizar operaciones sobre ellos. Las operaciones realizadas pueden hacer que el procesador deje de hacer los que estaba haciendo y salte a otra instrucción en otra parte de la memoria. Estos pequeños ladrillos dan al microprocesador moderno un poder casi ilimitado ya que puede ejecutar millones o incluso miles de millones de instrucciones por segundo.
Las instrucciones deben ser obtenidas de la memoria para irlas ejecutando. Las propias instrucciones pueden hacer referencia a datos en la memoria, y esos datos deben ser obtenidos de la memoria y guardados en ella cuando se requiera.
El tamaño, número y tipo de registros dentro de un microprocesador depende enteramente de su tipo. Un procesador Intel 486 tiene un conjunto diferente de registros que un procesador Alpha AXP; para empezar, los del Intel son de 32 bits de ancho, y los del Alpha AXPson de 64 bits. En general, sin embargo, cualquier procesador tendrá un número de registros de propósito general y un número menor de registros dedicados. La mayoría de los procesadores tiene los siguientes registros de propósito específico o dedicados:
Las pilas de algunos procesadores crecen hacia el final de la memoria mientras que las de otros crecen hacia el principio, o base, de la memoria. Algunos procesadores permiten los dos tipos, como por ejemplo los ARM.
Las memorias caché y principal deben mantenerse sincronizadas (coherentes). En otras palabras, si una palabra de memoria principal se almacena en una o más posiciones de la caché, el sistema debe asegurarse de que los contenidos de la caché y de la memoria sean los mismos. El trabajo de coherencia de la caché es llevado a cabo parcialmente por el hardware y parcialmente por el sistema operativo. Esto es cierto también para un número de tareas principales del sistema, donde el hardware y el software deben cooperar íntimamente para alcanzar sus objetivos.
Todos los controladores son diferentes, pero usualmente tienen registros que los controlan. El software que se ejecute en la CPU debe ser capaz de leer y escribir en esos registros de control. Un registro puede contener un estado que describa un error. Otro puede ser usado para propósitos de control; cambiando el modo del controlador. Cada controlador en un bus puede ser accedido individualmente por la CPU, esto es así para que el software gestor de dispositivos pueda escribir en sus registros y así controlarlo, La banda IDE es un buen ejemplo, ya que ofrece la posibilidad de acceder a cada unidad en el bus por separado. Otro buen ejemplo es el bus PCI, que permite acceder a cada dispositivo (por ejemplo una tarjeta gráfica) independientemente.
Existen ocasiones en las que los controladores necesitan leer o escribir grandes cantidades de datos directamente desde o a la memoria del sistema. Por ejemplo, cuando se escriben datos del usuario al disco duro. En este caso, se usan controladores de Acceso Directo a Memoria (Direct Memory Access - DMA) para permitir que los periféricos hardware accedan directamente a la memoria del sistema, pero este acceso está bajo el estricto control y supervisión de la CPU.