Después de portar Linux a Sega MegaDrive, se implementó la posibilidad de ejecutar el núcleo de Linux con el conjunto de utilidades Busybox en la consola de videojuegos Atari Jaguar, lanzada en 1993. La consola venía equipada con un CPU Motorola 68000, contaba con 2 MB de RAM y como almacenamiento permanente podía utilizar cartuchos de hasta 6 MB. El dispositivo estaba equipado con dos coprocesadores: Tom (GPU con arquitectura RISC de 32 bits + procesador de video de 64 bits + procesador de 64 bits para operaciones lógicas) y Jerry (DSP con arquitectura RISC de 32 bits para manejar sonido).
De manera similar al puerto para Sega MegaDrive para ejecutar el núcleo Linux en un CPU Motorola 68000, que no tiene un módulo de gestión de memoria (MMU) por hardware, el núcleo estándar 7.2.0-rc1 se ensambló en el modo 'NOMMU' utilizado para microcontroladores, permitiendo usar un modelo de memoria plano con un espacio de direcciones lineal (anteriormente, los desarrollos para operar sin MMU se trabajaron en un fork del núcleo uClinux, pero luego fueron adoptados en el núcleo principal en forma de opción 'NOMMU'). El problema de la falta de memoria RAM se resolvió de otra manera, a través de la implementación del mecanismo execute-in-place (XIP), que permite ejecutar directamente el código del núcleo desde la ROM sin copiarlo a la memoria RAM.
La RAM en el dispositivo se refleja en la dirección 0x000000, mientras que la ROM (cartucho) está en la dirección 0x80000; por lo tanto, los componentes del núcleo Linux se dividieron en dos áreas de memoria separadas: las secciones .rodata y .text con constantes y código se ubicaron en el cartucho, mientras que las secciones .data y .bss con datos modificables estaban en la memoria RAM. Dado que el CPU 68000 busca la tabla de vectores de interrupción en la dirección 0x0, y el núcleo se coloca realmente en el cartucho, cuyo contenido se refleja en la dirección 0x80000, se aplicó adicionalmente un hackeo que copiaba los vectores de interrupción a la RAM.
El problema de la falta de un temporizador en el CPU Motorola 68000 se resolvió utilizando los temporizadores usados en el DSP para la síntesis de sonido. Estos temporizadores se utilizaron para generar interrupciones para activar el planificador de tareas. Para mostrar mensajes del núcleo durante el arranque, se escribió un controlador de consola separado que realizaba la salida simulando un puerto paralelo a través de las salidas TXD y RXD, controladas a través del procesador DSP.
Para la construcción de los componentes del espacio de usuario, se utilizó la herramienta Buildroot con parches del proyecto LinuxMD. Para ahorrar memoria durante la inicialización, se invocó directamente la shell "\/bin\/busybox sh", la función malloc en la biblioteca uClibc se reemplazó por una versión simplificada malloc-simple, que no conserva metadatos adicionales, y en lugar de un cargador completo como U-Boot, se realizó una transferencia directa de control al núcleo mediante el comando "jmp $80000".

Fuente: opennet.ru
