← 返回信息流
AI 资讯Hacker News·2 小时前

老古董Atari Jaguar竟能跑Linux了

原标题:Linux on the Atari Jaguar. No, really.

速览

复古游戏主机Atari Jaguar近日迎来了一项非官方的技术壮举:开发者成功在其上运行了Linux操作系统。这一移植工作展示了老硬件在开源系统下的潜力,尽管实用性有限,但为复古计算爱好者提供了新的探索方向。

AI 深度解读

背景

Atari Jaguar 是 1993 年 11 月在北美发行的游戏主机,号称拥有(备受争议的)64 位纯性能。然而,即便后来推出了光碟附加组件 Jaguar CD,它依然沦为商业失败的产物——Jaguar CD 的销量甚至更差,这是 Atari 在试图与 Sony PlayStation 和 Sega Saturn 竞争时所做的绝望尝试。

在硬件层面,Jaguar 搭载了一颗 Motorola 68000 家族处理器。Motorola 68000 是一款 CISC 处理器,内部寄存器宽度为 32 位,但数据总线为 16 位(因此常被描述为“内部 32 位 / 外部 16 位”),地址总线为 24 位,最大可寻址 16MB 内存。它于 1979 年发布,后来被广泛用于各类商业硬件:原始 Macintosh、Apple Lisa、Commodore Amiga 系列、Sega Genesis/Megadrive、Neo-Geo AES、Plexus 工作站……以及 Jaguar。

Linux 内核至今仍保留着面向 68000 处理器家族的架构代码(arch/m68k/),涵盖 68040、68030、68010 乃至原始的 68000。正是这一基础使得在 Jaguar 上运行 Linux 成为可能。

核心内容

为什么要做这件事?

“因为我们可以(大概)。” 移植者决定将 Linux 带到 Jaguar 上,尽管这款主机早已退出历史舞台。

技术挑战与解决路径

1. MMU 缺失问题

通常认为 Linux 需要 MMU(内存管理单元)才能运行,但 uClinux(无 MMU 的 Linux)从过去的下游分支已合并到主线内核中,尤其对 m68k 架构而言,uClinux 提供了“平展内存模型”(Flat memory model)支持。通过在内核配置中启用相应选项(禁用 MMU、使用 Flat 模型),理论上即可编译。

2. 内存紧缩

Jaguar 仅有 2MB RAM(映射地址 0x000000)和最多 6MB ROM(卡带,映射地址 0x80000),以及两个内存映射的自定义 IC:Tom(GPU)和 Jerry(DSP)。主要障碍是内存太小——即使去掉调试功能、精简内核特性,仍可能连内核本身都无法加载到 RAM 中(更别提 initramfs)。

解决方案:利用 Linux 的“就地执行”(XIP,eXecute-In-Place)能力,将内核的只读段(.rodata、.text)存储在 ROM 中,而将动态段(.data、.bss)存放在 RAM 中。只需告诉内核 RAM 和 ROM 的位置,Linux 会自动处理重定位。

3. 启动所需的基础设施

  • 输出设备:Jaguar 的 DSP(Jerry)具有 TXD 和 RXD 引脚,原本用于声音,可复用作串行输出。编写一个简单的控制台驱动程序,通过 bit-banging 方式操作这些引脚,就能看到早期 printk 消息。
  • 定时器(PIT):Jerry IC 内置两个定时器,原本用于声音计时,但可将其触发的中断接入 68000 处理器,作为 Linux 的时钟源(PIT),用于校准调度器和其他依赖定时器的子系统。

4. 编译器问题

Ubuntu 仓库自带的 m68k-linux- 交叉编译器即使在添加 -68000 选项后仍会生成非对齐内存访问指令,而原始 68000 不支持非对齐访问处理,因此内核直接崩溃。改用从源码构建、专门针对 m68k-elf- 并指定 68000 的编译器才解决此问题。

5. 向量表与内存映射

由于 Jaguar 的 ROM 映射在 0x80000 而非 0x00000,68000 启动时会跳转至向量基址寄存器(VBR)指向的 0x0,但该处没有处理程序,导致死机。需要在 Jaguar 平台特定的 Linux 代码中,将向量表通过 memcpy 复制到 RAM 基地址来修复。

6. 调试工具

调试过程中还发现 gdb-multiarch 无法正确与 MAME 的 gdbtsub 通信,最终不得不从源码编译 m68k 专用的 gdb 才得以正常调试。

最终结果

经过上述调整,内核成功启动并输出了日志信息(Linux 7.2.0-rc1+,uClinux with CPU MC68000,Flat model support),校准了延迟循环(1.04 BogoMIPS),初始化了内存区域(共 512 页,2MB)。但随后系统尝试寻找并执行 init 进程——而用户空间尚未构建——因此再次崩溃。

用户空间的困难

由于缺少 MMU,无法使用 ELF 文件,必须使用 FLAT 二进制格式。需要将 ELF 转换为 FLAT 的工具 elf2flt,而作者尚未找到独立编译该工具的方法。用户空间的搭建仍是未完成的工作。

关键要点

  • Atari Jaguar 是一台 1993 年发布的 64 位游戏主机,商业失败,但使用 Motorola 68000 处理器,为运行 Linux 提供了架构基础。
  • Linux 对 m68k 的支持 依然存在于主线内核(arch/m68k/),包括原始 68000 的代码,且 uClinux(无 MMU)已内建支持。
  • 主要硬件限制:仅 2MB RAM、6MB ROM,无 MMU,需要借助 XIP 技术将内核只读部分放在 ROM,可读写部分放在 RAM。
  • 启动最小需求:必须提供串行输出(复用 DSP 的引脚)和可编程定时器(复用 Jerry 的定时器)。
  • 编译器陷阱:默认交叉编译器生成非对齐访问,导致原始 68000 崩溃,需专用工具链。
  • 向量表重置:ROM 映射地址 0x80000 而非 0x0,需在平台初始化时手动复制向量表到 RAM 基址。
  • 最终状态:Linux 内核(无 MMU 版本)成功启动并输出日志,但因缺少用户空间而无法完成引导。
  • 用户空间问题:需使用 flat 二进制格式,elf2flt 工具链搭建尚未完成。

意义与影响

这项移植工作表面上是一项复古硬件上的技术实验,但其意义远超“在旧游戏机上运行 Linux”本身:

  1. 验证了 Linux 内核的底层可移植性:通过克服无 MMU、极小内存、非标准内存映射、编译器缺陷等障碍,展示了 Linux 作为通用操作系统内核的适应能力,尤其是 uClinux 对资源极度受限硬件的支持。
  2. 为嵌入式系统提供参考:Jaguar 的硬件特性(内存紧张、无 MMU、需 XIP 执行)与现代低成本 MCU(如 Cortex-M 系列)有相似之处,移植过程中的技巧(如向量表重定位、时钟源复用、串行 bit-banging)可直接应用于其他裸机或极小系统场景。
  3. 挖掘历史硬件的学术价值:这项工作迫使作者深入理解 m68k 架构的启动流程、编译器行为、内存模型等底层细节,对计算机体系结构教育和逆向工程有启发意义。
  4. 社区与怀旧文化:Atari Jaguar 作为商业失败品,如今通过开源社区的 hack 重新获得关注,体现了技术爱好者对“不可能任务”的执着,也延续了游戏主机作为通用计算平台的探索传统。

尽管目前用户空间尚未完成,但内核的成功启动已经证明了概念可行性。后续若能解决 elf2flt 工具链和基本用户空间(如一个简单的 shell),则这台 1993 年的主机将真正运行 Linux,成为极简嵌入式 Linux 系统的又一实例。

查看原文 →cakehonolulu.github.io