Linux запущен на игровой приставке Atari Jaguar

Следом за портированием Linux на Sega MegaDrive реализована возможность запуска ядра Linux с набором утилит Busybox на игровой консоли Atari Jaguar, выпущенной в 1993 году. Приставка комплектовалась CPU Motorola 68000, поставлялась с 2 МБ ОЗУ и в качестве постоянного хранилища могла использовать картриджи, объёмом до 6 МБ. Устройство было оснащено двумя сопроцессорами: Tom (GPU c 32-разрядной архитектурой RISC + 64-разрядный процессор обработки видео + 64-разрядный процессор для выполнения логических операций) и Jerry (DSP с 32-разрядной архитектурой RISC для работы со звуком).

По аналогии с портом для Sega MegaDrive для выполнения ядра Linux на CPU Motorola 68000, не имеющем аппаратного модуля управления памятью (MMU), ядро 7.2.0-rc1 было собрано в применяемом для микроконтроллеров режиме «NOMMU», позволяющем использовать плоскую модель памяти с линейным адресным пространством. Проблема с нехваткой оперативной памяти была решена иначе, через задействование механизма execute-in-place (XIP), позволяющего напрямую выполнять код ядра из ПЗУ без копирования в оперативную память.

ОЗУ на устройстве отражено по адресу 0x000000, а ПЗУ (картридж) — по адресу 0x80000, соответственно компоненты ядра Linux были разделены на две отдельные области памяти: секции .rodata и .text с константами и кодом были размещены на картридже, а секции .data и .bss с изменяемыми данными в оперативной памяти. Так как CPU 68000 ищет таблицу векторов прерываний по адресу 0x0, а ядро фактически размещается на картридже, содержимое которого отражено по адресу 0x80000, дополнительно был применён хак с копированием векторов прерываний в ОЗУ.

Проблема с отсутствием таймера в CPU Motorola 68000 была решена через задействование таймеров, используемых в DSP для синтеза звука. Данные таймеры были применены для генерации прерываний для активации планировщика задач. Для вывода сообщений ядра во время загрузки был написан отдельный драйвер консоли, осуществлявший вывод с симуляцией параллельного порта через выводы TXD и RXD, управляемые через DSP-процессор.

Для сборки компонентов пространства пользователя был задействован инструментарий Buildroot с патчами от проекта LinuxMD. Для экономии памяти при инициализации напрямую вызывалась командная оболочка «/bin/busybox sh», функция malloc в библиотеке uClibc была заменена на упрощённый вариант malloc-simple, не сохраняющий дополнительные метаданные,
а вместо полноценного загрузчика, такого как U-Boot, выполнялась прямая передача управления ядру командой «jmp $80000».

Источник: http://www.opennet.ru/opennews/art.shtml?num=65866