Hoy en dÃa las computadoras no son un misterio para casi nadie. Uno compra las partes via Internet y cuando llegan, se pone uno a armarlas como se harÃa con un rompecabezas. O sea, estoy hablando de "PC", ese standard industrial en base al cual se fabrican partes en diversos lugares del mundo, especialmente en China. Pero ¿qué tal fabricar una computadora que no sea un PC?
Estoy hablando de diseñar y construir una computadora desde cero, es decir, sin un microprocesador; diseñar y construir el mismÃsimo CPU empleando circuitos integrados de mediana escala de integración (MSI) como se hacÃa en los años 70's.
HabrÃa que definir la arquitectura general de la máquina: Von Newman o Harvard, quizás un "stack machine"; decidir qué registros llevará, de cuantos bits cada uno, cuánta memoria será capaz de direccionar, los modos de direccionamiento, las instrucciones (cuales y cómo serán implementadas) cómo funcionarán las interrupciones y el DMA (o si no tendrá interrupciones ni DMA). Definirlo todo, y una vez definido, diseñarlo, construirlo, ponerlo a punto y echarlo a andar.
Esta justamente es la aventura en que me encuentro inmerso. No fue idea mÃa; la Web está llena de proyectos de este tipo, muy variados en diseño y propósito. He aquà una corta lista que he ido recopilando:
Hobrebrew CPUs
Llevo un mes y solo he llegado a definir la arquitectura de mi máquina asà como ganar alguna idea de cómo implementar los diferentes circuitos. Diseñado, lo que se dice "diseñado", no hay nada todavÃa. Sin embargo, en solo un mes leyendo intensamente sobre el tema, he aprendido un sin fin de cosas que antes no sabÃa.
El primer aporte ha sido darme cuenta de que una computadora funciona como un mecanismo de relojerÃa. Es todo lo contrario a esa percepción que tenemos cuando programamos un microcontrolador PIC, por ejemplo: Por más bajo que sea el nivel de nuestro código, siempre nos queda la sensación de que el CPU posee alguna "inteligencia" que le permite entender nuestro código y ejecutarlo al pie de la letra.
Cuando uno se mete a diseñar un CPU, uno se da cuenta de cuan mecánico es todo ese proceso. Repito, funciona como un mecanismo de relojerÃa: un clock hace correr un contador, este genera señales de tiempo T1, T2, T3, T4, etc., que combinadas con el código de la instrucción generan a su vez todas las señales de control necesarias para que el CPU funcione... paso a paso, tic a tic. Todo cuanto se hace dentro del CPU es abrir buffers de tres estados y "clockear" registros para que la información presente en el bus se registre permanente en su interior. No hay nada más sino esas acciones simples en las que nuestro código de instrucción no se diferencia demasiado de la rueda dentada de una cajita de música. Y eso es justamente lo que lo hace interesante.
Como interesante resultan la posibilidades que se abren ante nuestra creatividad. Podemos concebir prácticamente cualquier arquitectura por extraña que parezca. Y podemos también adoptar arquitecturas clásicas, estudiarlas, entenderlas en detalles y saborearlas con nuestros propios dedos, bit a bit, nano-segundo a nano-segundo.
Y ese es solo el primer capÃtulo de la aventura. El segundo capÃtulo es aún más apasionantes (y más especializado también): el software.
Si además de aprender de ella, pretendemos que nuestra máquina haga algo útil, entonces tendremos que proveerle un sistema operativo. ¿Pero cual? Todos los sistemas operativos se escriben (o más bien se "linkean" o enlazan) para una determinada plataforma: Intel x86, Alpha. Nadie ha escrito un sistema operativo para nuestra plataforma propietaria. Y por otra parte, nosotros no vamos a lanzarnos a escribir uno desde cero porque eso es una labor en extremo especializada y en lugar de reinventar la rueda, terminarÃamos inventando un pedazo de chatarra.
Lo que otros colegas han hecho es portar sistemas operativos existentes en el mundo del Open Source, como Minux2. Por lo que he visto son todos sistemas parecidos a UNIX (como lo es Linux) los cuales han sido escritos con la portabilidad en mente y además puedes contar con su código fuente casi siempre escrito en lenguaje C.
Pues bien, la tarea es agarrar uno de estos, entender el código (tarea bastante difÃcil para la cual hay que prepararse adquiriendo algún conocimiento de base sobre teorÃa de sistemas operativos) y proceder entones a "portarlo" a nuestro sistema, es decir, modificar el código para que pueda funcionar en nuestra plataforma propietaria.
Portarlo dije... con ¿cual compilador? Bueno, tampoco existe un compilador diseñado expresamente para genera código que puede funcionar en nuestra máquina. Asà que el primer paso será buscar un compilador en el mundo del Open Source y "portarlo" a nuestro entorno. Lo mismo con un ensamblador y un linker. De más está decir que estas tareÃtas se las traen porque constituye una especialidad dentro del desarrollo de software. Pasarán otros dos o tres años antes de haber logrado que todo eso funcione correctamente.
Si hemos tenido la paciencia suficiente, llegará el dÃa en que nos encontremos por fin ante una máquina diseñada en nuestro cerebro y construida por nuestras propias manos y que por tanto entendemos hasta el último tornillo. Esta máquina será todo claridad para nosotros, todo lo contrario a un PC corriendo Windows que es todo misterio (o todo ignorancia, que para el caso es igual).
En esta máquina correrá un sistema operativo que hemos "portado" del mundo del Open Source y hemos hecho funcionar en nuestra máquina. Y tendremos también un ensamblador, un linker y un compilador, prácticamente escritos por nosotros mismos.
Será esta la hora de sentarse a escribir (y depurar) aplicaciones útiles para nuestra máquina. En algún momento nos enfrentaremos a un bug y no sabremos si es un bug de la aplicación, del compilador, del linker, del sistema operativo, o un cable suelto en alguna tarjeta. Nuestros programas serán pues de los más difÃciles de poner a punto.
Si todo lo anterior no lo ha asustado los suficiente, le invito a participar en una aventura de estas. Mis notas están en un Web site que he abierto para ello. He aquà la dirección:
http://www.armandoacosta.com/cpu/
En eso ando por estos dÃas. ¿No me diga que no es divertido?