Monitor Software
Así es Linux funcionando sobre una Nintendo NES de 8 bits
Publicación:22-02-2025
TEMA: #Software
Se trata de una versión muy reducida del kernel de Linux que funciona sobre una consola NES de Nintendo, y que como habréis podido imaginar ha sido posible gracias a la emulación.
El responsable de este proyecto es «decrazyo», un programador que ha compartido todas sus claves en un vídeo muy interesante que hará las delicias de los más «geeks». Para entender lo complicado que era este proyecto debemos tener en cuenta que la NES tiene unas especificaciones mucho más modestas que las de cualquier PC de la época capaz de mover Linux.
Su CPU es una Ricoh 2A03 de 8 bits a 1,79 MHz, un chip que es muy inferior al que utilizaba un PC como el IBM 5150, que era de 16 bits, trabajaba a 4,77 MHz y podía manejar casi el doble de instrucciones. No obstante, ambos tienen ciertas similitudes que hicieron posible sacar adelante este proyecto recurriendo a la emulación.
En esencia, lo que ha creado «decrazyo» es un emulador de un PC IBM 5150 que funciona en una Nintendo NES, con todas las complicaciones que ello implica, ya que se trata de emular un sistema mucho más potente en un sistema que es claramente inferior. Es un proyecto interesante, aunque distinto de NES-OS.
El procesador fue uno de los principales problemas, pero la memoria tampoco se queda atrás. La base de este proyecto gira alrededor de ELKS, siglas en inglés de Embeddable Linux Kernel Subset, que por decirlo de una manera simple es la base más sencilla posible de Linux, y la que menos recursos consume. Tanto es así que solo necesita 128 KB de RAM, una cifra que es ridícula para los estándares actuales, pero que resulta muy elevada si hablamos de la NES de Nintendo, que solo tiene 2 KB.
Cómo fue posible mover Linux en una NES con solo 2 KB de RAM
Para resolver este problema se ha utilizado un chip de mapeado, que hace que solo resulte visible una pequeña parte de la memoria de un cartucho en cada momento concreto, y permite a la CPU seleccionar qué parte de la memoria quiere que sea visible, una técnica que se conoce como conmutación de bancos de memoria. La NES incorpora una solución capaz de gestionar hasta 1 MB de ROM en un cartucho, más de lo necesario para este proyecto.
Esa cantidad es suficiente para almacenar el emulador, la BIOS del PC, el kernel Linux, el archivo del sistema y dejar algo de espacio libre, pero lo complicado viene a continuación, porque es necesario hacer que Linux entienda cómo funciona este sistema de memoria, y presentar la RAM y la ROM como un espacio único de memoria contigua de 20 bits.
El siguiente paso fue preparar la emulación a nivel de CPU, que se dividió en cuatro grandes fases: búsqueda, descodificación, ejecución y escritura. Cada una de esas fases juega un papel fundamental. En la fase de búsqueda se calcula la dirección de la próxima instrucción de la CPU, y se copia en la caché de instrucciones del procesador.
La fase de descodificación analiza la instrucción para determinar qué hace y con qué valores trabaja. Esos valores se copian a ubicaciones temporales que serán utilizados más adelante. En la fase de ejecución realizan las tareas de computación de instrucciones, y se almacena el resultado en otra ubicación temporal. Finalmente en la fase de escritura se copia el resultado a su ubicación definitiva, para luego volver a empezar el proceso desde la fase de búsqueda.
Todo parecía avanzar, pero al final el proyecto se complicó tanto que no pudo utilizar un cartucho normal de Nintendo NES, y no tuvo más remedio que recurrir a un «truco» bastante curioso, hackear el emulador de NES que está integrado en Animal Crossing. Fue un proceso complicado, sobre todo por las limitaciones de memoria que impone ese emulador, pero al final fue posible superar dichas limitaciones, y el proyecto pudo salir adelante.
El resultado podemos verlo al final del vídeo, NES86 con base Linux funcionando sin problema en un emulador dentro de otro emulador de Nintendo NES. Como cabía esperar el rendimiento no es nada del otro mundo, y como prueba de ello tenemos la demo de Tetris, un juego que en su versión más simple, limitado a blanco y negro, funciona a un fotograma cada treinta segundos. Sí, habéis leído bien, cada treinta segundos genera un fotograma.
« Especial »