Linux on the Atari Jaguar: A uClinux Bringup
A developer known as cakehonolulu has successfully booted Linux 7.2.0-rc1 on the Atari Jaguar, a 1993 console with 2 MB RAM and a Motorola 68000 CPU. The port leverages uClinux, the MMU-less variant now merged into mainline Linux for m68k. The source code is available on GitHub.
Why the Jaguar?
The Jaguar uses a 68000 CPU at its core. Linux has maintained m68k architecture support for decades, including the 68000 variant under arch/m68k/. The console has 2 MB RAM (mapped at 0x000000) and up to 6 MB ROM (cartridge at 0x80000). The challenge: Linux normally requires an MMU, but uClinux enables flat memory model support.
The MMU-less Kernel
Enabling uClinux is a matter of kernel config: disable MMU, select flat memory model, and enable CONFIG_BINFMT_FLAT. But the kernel binary itself is too large for 2 MB RAM. The solution is XIP (Execute-In-Place): store read-only sections (.text, .rodata) on ROM and dynamic sections (.data, .bss) in RAM. This is configured via CONFIG_ROM_START, CONFIG_ROM_LENGTH, CONFIG_ROMVEC, and CONFIG_ROMSTART.
Serial Output via Jerry DSP
For debugging output, the developer repurposed the Jerry DSP's TXD/RXD pins as a bit-banged UART. A simple console driver (early_jerry0) outputs kernel messages. The Jerry's timers serve as the system timer for scheduling.
The Compiler Bug
The stock m68k-linux-gnu cross-compiler from Ubuntu emits unaligned memory accesses even with -m68000. The 68000 does not handle unaligned accesses, causing crashes. Building a custom m68k-elf-gcc from source targeting 68000 fixed this. Additionally, the ROM is mapped at 0x80000, but the CPU expects vectors at 0x0. A memcpy of the vectors to RAM base was added in platform-specific code.
Userspace: FLAT Binaries and Busybox
Without an MMU, ELF binaries won't work. FLAT binaries (bFLT format) are required. The elf2flt tool is tricky to build standalone, but Buildroot handles it. The developer used Buildroot with uClibc and a custom malloc strategy (malloc-simple) to reduce memory overhead. Busybox was compiled as a FLAT binary. The init script is minimal:
#!/bin/busybox sh
/bin/busybox sh
Attempting busybox --install caused OOM, so only the shell is available. The rootfs is packed as a cpio archive and embedded into the kernel image.
Real Hardware Considerations
For real hardware, the kernel binary must be compiled at a fixed offset from 0x80000 to accommodate the Jaguar cartridge header (8 KB). Adjust CONFIG_ROM_START and CONFIG_ROMVEC accordingly. The developer also implemented a Tom GPU console driver for display output.
Boot Log
The kernel boots successfully, as shown in the dmesg output:
Linux version 7.2.0-rc1+ (cakehonolulu@jaguar) (m68k-elf-gcc (GCC) 16.1.0) #38 Sun Jul 5 11:56:37 CEST 2026
uClinux with CPU MC68000
Flat model support (C) 1998,1999 Kenneth Albanowski, D. Jeff Dionne
Calibrating delay loop... 1.04 BogoMIPS (lpj=5248)
The kernel then tries to execute init but crashes without a proper userspace. With the Busybox shell, it reaches a shell prompt.
How to Reproduce
- Build Buildroot with m68k 68000 target, enable uClibc, change malloc to
malloc-simpleviamake uclibc-menuconfig. - Build Busybox with custom
.config(provided in the blog). - Create initramfs directory structure with
/dev/consoleand init script. - Build Linux kernel with uClinux config, set ROM addresses, and embed initramfs.
- Convert
vmlinuxto binary withobjcopy, add Jaguar cartridge header at 0x80000.
The modified Linux tree is at github.com/cakehonolulu/linux_jag.
Limitations
- No bootloader (u-boot) due to memory constraints.
- Only a single shell process; no multi-tasking userspace.
- The port is a proof-of-concept, not a daily driver.
This project demonstrates that even a 30-year-old console can run modern Linux with careful configuration and a lot of patience.

