Linux on the Atari Jaguar: Porting a Modern Kernel to 64-bit Console Hardware
Linux on the Atari Jaguar: Porting a Modern Kernel to 64-bit Console Hardware
Atari Jaguar는 1993년 출시된 64비트 파워하우스로 마케팅된 콘솔이며, 이제 현대적인 Linux 커널을 지원합니다. MMU가 없는 환경을 위해 uClinux를 활용하고 제한된 RAM을 관리하기 위해 Execute‑In‑Place (XIP)를 구현함으로써 시스템은 기능적인 Busybox 쉘로 부팅될 수 있습니다.
Overcoming Memory Constraints with XIP and uClinux
Atari Jaguar에 Linux를 포팅하는 주요 과제는 2 메가바이트라는 극심한 메모리 제한입니다. 커널을 맞추기 위해 프로젝트는 메모리 관리 유닛(MMU)이 없는 프로세서를 위해 설계된 Linux 변형인 uClinux를 사용합니다. 이를 통해 시스템은 가상 메모리 대신 플랫 메모리 모델을 사용할 수 있습니다.
RAM 사용량을 더욱 최적화하기 위해 커널을 Execute‑In‑Place (XIP) 방식으로 두 개의 메모리 영역으로 나눕니다:
- ROM (Cartridge):
.rodata와.text와 같은 읽기 전용 섹션을 저장합니다. - RAM:
.data와.bss와 같은 동적 섹션을 저장합니다.
Linux 커널에 RAM과 ROM 경계 위치를 알려 주면, 커널이 자동으로 재배치를 수행해 부팅 과정 중 Out‑Of‑Memory (OOM) 충돌을 방지합니다.
Hardware Bringup: UART, Timers, and Vector Handling
커널을 부팅하려면 두 가지 기본 요소가 필요합니다: 출력 방법과 시스템 타이머.
Serial Output via Jerry IC
Jaguar의 "Jerry" IC(DSP)에는 TXD와 RXD 핀이 있습니다. 이 핀들을 비트‑뱅킹하는 작은 콘솔 드라이버를 작성함으로써 개발자는 earlyprintk 메시지를 캡처할 수 있는 UART‑유사 직렬 출력을 구현했으며, 이는 부팅 시퀀스 디버깅에 필수적입니다.
System Timer and Scheduler
Jerry IC는 두 개의 타이머도 제공합니다. 그 중 하나를 프로그래머블 인터벌 타이머(PIT)로 재활용하여 Linux 커널이 딜레이 루프를 보정하고, 스케줄러를 설정하며, 시스템 틱을 관리하도록 했습니다. 이를 위해 Motorola 68000 CPU의 보드‑특정 초기화를 재정의해야 했습니다.
Vector Relocation
ROM이 0x80000에 매핑되고 0x0이 아니라는 이유로, Motorola 68000 CPU는 리셋 시 Vector Base Register(VBR) 0x0으로 점프하려 합니다. 시스템이 크래시되는 것을 방지하기 위해 개발자는 인터럽트 벡터를 RAM 베이스로 memcpy하는 코드를 구현했습니다.
Toolchain Challenges and Compiler Fixes
표준 크로스 컴파일러는 종종 기본 Motorola 68000과 호환되지 않는 문제를 일으킵니다. 프로젝트는 두 가지 주요 툴체인 장애물을 마주했습니다:
- Unaligned Memory Access: Ubuntu 저장소에 있는
m68k-linux-크로스 컴파일러는 정렬되지 않은 메모리 접근을 생성했으며, 이는 기본 68000이 처리할 수 없어 즉시 크래시가 발생했습니다. 이를 해결하기 위해m68k-elf-을 목표로 소스에서 직접 빌드한 컴파일러를 사용했습니다. - Flat Binaries: 시스템에 MMU가 없으므로 표준 ELF 파일을 사용할 수 없습니다. 프로젝트는
buildroot(특히linuxmd프로젝트의 2026년 5월 패치)를 이용해 FLAT 바이너리를 생성했습니다.
Implementing Userspace and Rootfs
기능적인 쉘을 구현하기 위해 프로젝트는 cpio로 패킹된 rootfs를 vmlinux 이미지에 직접 포함시켰습니다.
Busybox and Memory Optimization
Busybox는 nommu 타깃을 지원하기 때문에 사용자 공간 환경으로 선택되었습니다. 하지만 Busybox를 사용해도 메모리가 매우 빡빡했습니다. init 실행 중 OOM 패닉을 방지하기 위해 다음과 같은 최적화를 적용했습니다:
- Simplified Init:
init스크립트를/bin/busybox sh를 호출하는 간단한 shebang으로 줄여--install명령어가 차지하는 메모리 오버헤드를 없앴습니다. - uClibc Malloc Strategy:
buildroot의 menuconfig에서uClibc라이브러리의 malloc 전략을malloc-simple로 변경했습니다. 이는 복잡한 할당 전략에 필요한 메타데이터가 남은 RAM을 잡아먹는 것을 방지합니다.
Hardware Deployment
실제 하드웨어에 배포하려면 vmlinux 바이너리를 Jaguar 카트리지 헤더를 수용하도록 0x80000에서 고정 오프셋으로 컴파일해야 합니다. 이를 위해 CONFIG_ROM_START, CONFIG_ROM_LENGTH, CONFIG_ROMVEC, CONFIG_ROMSTART에 8KB 오프셋을 추가해야 합니다.
또한 실제 하드웨어에서 커널이 화면에 직접 텍스트를 출력할 수 있도록 "Tom" IC(GPU/블리터)용 간단한 콘솔 드라이버도 구현했습니다.
Community Insights
열성 팬들 사이의 토론에서는 원래 Macintosh부터 Sega Genesis까지 모든 것을 구동했던 Motorola 68000 아키텍처의 역사적 의미가 강조되었습니다. 한 기여자는 프린터, 자동차, PDA 등에서 광범위하게 사용된 이력 때문에 Linux 소스 트리에서 68k 지원이 아직도 유지되고 있다고 언급했습니다.
커뮤니티에서 제시한 다른 기술적 제안은 다음과 같습니다:
- RAM Expansion: 추가 RAM을 탑재한 맞춤형 카트리지를 제작해 8 MB 주소 공간을 확장하는 가능성.
- GPU/DSP Utilization: Jaguar의 GPU와 DSP를 완전히 활용하면 프로젝트가 "광화된 Atari ST" 수준을 넘어설 수 있다는 제안.
SUMMARY: Developer cakehonolulu successfully ported Linux 7.2.0-rc1+ to the Atari Jaguar, overcoming memory constraints and toolchain issues to boot a Busybox shell on original hardware.
TITLE: Linux on the Atari Jaguar: Porting a Modern Kernel to 64-bit Console Hardware