Dopo la portabilità di Linux su Sega MegaDrive, è stata realizzata la possibilità di eseguire il kernel Linux con un insieme di utilità Busybox sulla console di gioco Atari Jaguar, rilasciata nel 1993. La console era dotata di CPU Motorola 68000, veniva fornita con 2 MB di RAM e poteva utilizzare cartucce come memoria permanente, con una capacità di fino a 6 MB. Il dispositivo era equipaggiato con due coprocessori: Tom (GPU con architettura RISC a 32 bit + processore video a 64 bit + processore a 64 bit per l'esecuzione di operazioni logiche) e Jerry (DSP con architettura RISC a 32 bit per lavorare con il suono).
Analogamente al porto per Sega MegaDrive per l'esecuzione del kernel Linux su CPU Motorola 68000, che non dispone di un modulo hardware di gestione della memoria (MMU), il kernel standard 7.2.0-rc1 è stato compilato in modalità «NOMMU», che consente di utilizzare un modello di memoria piatta con uno spazio di indirizzamento lineare (in precedenza, i lavori per il funzionamento senza MMU erano stati sviluppati in un fork del kernel uClinux, ma poi sono stati integrati nel kernel principale come opzione «NOMMU»). Il problema della mancanza di memoria RAM è stato risolto in un altro modo, attraverso l'uso del meccanismo execute-in-place (XIP), che consente di eseguire direttamente il codice del kernel dalla ROM senza copiare nella memoria RAM.
La RAM del dispositivo è mappata all'indirizzo 0x000000, mentre la ROM (cartridge) è a 0x80000. Di conseguenza, i componenti del kernel Linux sono stati separati in due distinte aree di memoria: le sezioni .rodata e .text con costanti e codice sono state posizionate sulla cartridge, mentre le sezioni .data e .bss con dati mutabili si trovano nella RAM. Poiché la CPU 68000 cerca la tabella dei vettori delle interruzioni all'indirizzo 0x0 e il kernel è effettivamente posizionato sulla cartridge, il cui contenuto è mappato all'indirizzo 0x80000, è stata applicata una hack per copiare i vettori delle interruzioni nella RAM.
Il problema della mancanza di un timer nella CPU Motorola 68000 è stato risolto utilizzando i timer impiegati nel DSP per la sintesi audio. Questi timer sono stati utilizzati per generare interruzioni per attivare lo scheduler. È stato scritto un driver della console separato per visualizzare i messaggi del kernel durante il boot, simulando una porta parallela tramite le uscite TXD e RXD, controllate attraverso il processore DSP.
Per assemblare i componenti dello spazio utente è stato utilizzato il toolchain Buildroot con patch dal progetto LinuxMD. Per risparmiare memoria durante l'inizializzazione, è stata chiamata direttamente la shell «/bin/busybox sh», e la funzione malloc nella libreria uClibc è stata sostituita da una versione semplificata, malloc-simple, che non conserva metadati aggiuntivi. Invece di un bootloader completo come U-Boot, è stata eseguita una trasmissione diretta al kernel tramite il comando «jmp $80000».

Fonte: opennet.ru
