Sega自己写的32X硬件手册里有一句话:别在这台机器上用TAS指令。用了会怎样,官方没保证。三十年后,一个想练手的开发者偏偏要在这台机器上跑通Linux多核——而多核系统要用的原子操作,恰好绕不开这类指令的等价功能。

这不是一次简单的"复古主机装Linux"。继此前把Linux搬上Atari Jaguar之后,这位开发者(网名cakehonolulu)把目标换成了1994年的Sega 32X。这次的难点不在能不能开机,而在两颗CPU怎么协同工作——32X的硬件,压根没给协同工作准备好条件。

32X是台什么样的过渡机器

32X是Sega Genesis(16位)和即将到来的Saturn(32位)之间的补丁式产品,靠卡带槽外接一块加装板,自带独立电源和视频输出,和更早的Sega CD叠在一起就是玩家戏称的"力量塔"——三块电源、一堆转接线,商业上没成功。

项目Genesis32X
主CPU1×Motorola 68000@7.6MHz2×Hitachi SH-2@23MHz
位宽16位32位
最大显色64色32768色

算力差距很大,但两颗SH-2共享同一块外部总线和SDRAM,架构上等价于一个最简版的对称多处理器——只是设计年代早于成熟的SMP总线协议。

手册说不要用,他却必须用

Linux的SMP子系统要管理多核,离不开几样东西:原子比较交换、缓存一致性、核间中断。32X三样都没有。

硬件手册明确禁止使用TAS指令,理由是32X的总线不支持带锁的读改写周期,用了行为不可控。两颗SH-2之间也没有直接的核间中断线,唯一的总线仲裁只保证两颗CPU不会同时抢总线,不提供任何原子性保证。

也就是说,Linux内核默认假设存在的那些同步原语,在这块1994年的加装板上一样都不存在。

  • 风险.手册的禁令不是保守措辞,是SH-2/32X总线设计的真实边界,硬闯TAS会得到不可预测的行为。

拿一个上世纪的算法救场

没有硬件原子指令,就只能靠软件凑。他选的是Peterson算法——一种只用普通读写变量、不依赖任何原子操作就能实现双进程互斥的经典算法,把同步变量放进非缓存内存,避开缓存不一致的问题。

Linux要求的cmpxchg等原子操作,靠这套软件互斥逐一搭出来。核间中断没有硬件通道,就借道Genesis侧的68000:一颗SH-2把命令写进通信寄存器,68000读出来再决定给主SH-2还是从SH-2发中断,充当一个临时的总线仲裁器和中断转发站。连"我是哪颗CPU"这个基础问题,也是靠征用SH-2内部原本闲置的分频寄存器当CPU-ID寄存器解决的。

从硬件缺口到软件补丁 硬件缺什么 TAS指令被禁用 无缓存一致性 无原子CAS 无核间中断线 软件怎么补 Peterson算法互斥 同步变量放非缓存内存 68000转发核间中断 分频寄存器当CPU-ID 代价是什么 总线严重争用 轮询开销大 系统能跑,但很慢

Peterson算法诞生于并发理论还在打基础的年代,专为"没有原子指令"这种约束设计。三十年后的游戏机加装板,恰好重新落进了这个约束里——不是巧合,是同一类硬件局限逼出了同一类解法。

手册禁止的那条指令,最后被一整套软件绕过

跑通了,但别当真能用

代价很直接:总线争用严重,软件自旋锁本身也有开销,作者自己形容性能"abysmal"(糟糕)。这套SMP能跑,但跑得慢,不构成一个日常可用的多核系统。

  • 结论.这更接近一次"没有原子指令时怎么做并发"的现场教学,证明可行性,不是交付可用系统。

值得对照的是反响。他此前的Jaguar Linux项目上过几家媒体,在Hacker News也拿到不少关注。这次32X项目在Reddit的公告帖下,截至目前还没有评论,也没查到对应的Hacker News讨论。同一个作者,同一种玩法,热度不一定复制。这提醒一件事:硬核技术项目的传播,靠的不只是难度,还得看平台愿不愿意接这个梗。

对关注board bring-up和SuperH生态的人来说,这个项目真正沉淀下来的,是一套在无原子指令平台上实现Linux并发原语的思路,以及一份SH2工具链的实践记录——这比"又一台老游戏机装上了Linux"本身更值得记一笔。