← На главную

Запустили Linux на Sega 32X от Krikkz: 4 МБ ОЗУ и SMP на двух SH2

13.07.2026 18:18 · hackernews

Портировать Linux на Sega 32X оказалось возможным — и это сделали. 32X — это дополнение к Sega Genesis с двумя Hitachi SuperH SH2 (23 МГц), 256 КБ SDRAM и 256 КБ видеопамяти. Памяти катастрофически мало для ядра, но на помощь пришёл FPGA-флеш-картридж от Krikkz. Он использует Extended SSFv2 Mapper, который позволяет превратить ROM в RAM — так удалось получить 4 МБ ОЗУ. Часть оставили под сам бинарник Linux (~540 КБ), остальное — под данные.

Сборка началась с проблем: GCC выдавал Internal Compiler Error на kernel/nstree.c. Нашёлся workaround. Дальше — больше: пришлось чистить ashlsi3, ashrsi3 и lshrsi3 — они затирали регистры, ломая стек. Аналогичный фикс сделали для arch/sh/lib/checksum.S, потому что SH2 в 32X не поддерживают инструкцию shrd.

Чтобы просто вывести сообщения, написали earlycon-драйвер: UART на Genesis, символы передавались через 68000. После этого Linux дошёл до калибровки часов — для неё сделали драйвер Free Running Timer на SH2.

Самое интересное — SMP. У SH2 нет аппаратных примитивов синхронизации (ни TAS.B, ни кэш-когерентности). Выход — Peterson's algorithm, позаимствованный из архитектуры sparc32. 68000 выступает в роли арбитра: он получает команды от SH2, дёргает линии прерываний, доставляя IPI. Для идентификации CPU использовали регистр DVSR (SH2-private divider). Каждое ядро при старте получает свой ID в него.

После двух ночей отладки (проблема с default_idle() — шедулер сбрасывал оба CPU в idle) SMP заработал: «Brought up 1 node, 2 CPUs». Производительность, конечно, никакая — bus contention и мягкая синхронизация, но работает.

Напоследок сделали простой консольный драйвер для вывода на экран. Всё это уместилось в сильно урезанные Linux + Busybox (постоянно вылетал OOM — пришлось сажать на диету). Конфиги: mars_defconfig, busybox config и init script опубликованы отдельно.

Читать оригинал →