在 Sega 32X 上运行 Linux:谁还需要硬件同步原语?
来源:cakehonolulu.github.io — cakehonolulu — 2026-07-13
📋 概述
继在 Atari Jaguar 上运行 Linux 之后,作者 cakehonolulu 成功将 Linux 移植到了 Sega 32X(1994 年发售的 Genesis/Mega Drive 扩展模块)。32X 拥有两颗 23MHz 的 Hitachi SH2 处理器和一颗 68000,但仅有 256KB 系统 RAM + 64KB VRAM——远不足以运行 Linux。
作者利用 Krikkz 烧录卡的 SSFv2 mapper 功能将 4MB ROM 映射为可写 RAM,并通过交叉编译 sh2eb-elf 工具链、修复 GCC 内部错误和寄存器冲突问题,成功让内核启动。最惊人的成就是:在 SH2 没有硬件同步原语(无 TAS 指令、无缓存一致性)的情况下,使用 Peterson 算法纯软件实现 SMP,让两颗 SH2 同时运行,并以 68000 作为总线仲裁器和 IPI 路由器。最终在实机上输出了 Linux 控制台画面。
🔑 核心要点
- Sega 32X 硬件:2× Hitachi SH2 @ 23MHz + Motorola 68000 @ 7.6MHz,256KB 系统 RAM + 256KB VRAM
- 内存瓶颈突破:利用 Krikkz 烧录卡的 SSFv2 Extended Mapper 将 4MB ROM 映射为可写 RAM(540KB 留给内核二进制 + initramfs)
- 工具链地狱:sh2eb-elf 交叉编译器遇到 GCC ICE(内部错误),以及 ashlsi3/ashrsi3/lshrsi3 寄存器冲突导致栈破坏
- Linux 内核适配:编写 SH2 FRT 定时器驱动、earlycon 驱动(32X → Genesis UART 字符转发),使用 ELF FDPIC + musl 构建 rootfs
- 无硬件同步原语的 SMP:SH2 缺少 TAS 指令和缓存一致性,作者参考 sparc32 代码,用 Peterson 算法纯软件实现 cmpxchg 等原语,以 68000 作为 IPI 路由器
- CPU 识别技巧:将 SH2 硬件除法器寄存器(DVSR)作为 CPUID_REG,由 bootloader 写入 CPU 编号
- 性能和总线争用"惨不忍睹",但双核 SMP 确实在工作——smp: Brought up 1 node, 2 CPUs
- 完整代码公开:Linux 内核 mars_defconfig、Busybox 配置、init 脚本均在 GitHub 可获取
💡 金句
Performance is abysmal, bus contention is bonkers; but it does work, and that's fine by me.
← 返回 HN 首页