Linux uruchomiony na konsoli do gier Atari Jaguar

Po przeniesieniu systemu Linux na Sega MegaDrive wprowadzono możliwość uruchamiania jądra Linux z zestawem narzędzi Busybox na konsoli do gier Atari Jaguar, wydanej w 1993 roku. Konsola była wyposażona w procesor CPU Motorola 68000, 2 MB pamięci RAM i mogła wykorzystywać kartridże jako stałe nośniki o pojemności do 6 MB. Urządzenie miało dwa koprocesory: Tom (GPU z 32-bitową architekturą RISC + 64-bitowy procesor do przetwarzania wideo + 64-bitowy procesor do realizacji operacji logicznych) oraz Jerry (DSP z 32-bitową architekturą RISC do obsługi dźwięku).

Na wzór portu dla Sega MegaDrive, realizującego jądro Linux na CPU Motorola 68000, pozbawionym sprzętowego modułu zarządzania pamięcią (MMU), standardowe jądro 7.2.0-rc1 zostało zbudowane w trybie "NOMMU" przeznaczonym dla mikrokontrolerów, co pozwala na wykorzystanie płaskiego modelu pamięci z liniowym adresem przestrzeni (wcześniejsze prace nad działaniem bez MMU rozwijały się w fork-u jądra uClinux, ale później zostały przyjęte do głównego jądra jako opcja "NOMMU"). Problem braku pamięci RAM został rozwiązany w inny sposób, poprzez zastosowanie mechanizmu execute-in-place (XIP), który umożliwia bezpośrednie wykonywanie kodu jądra z ROM, bez kopiowania go do pamięci RAM.

Pamięć RAM w urządzeniu jest odwzorowana pod adresem 0x000000, a ROM (kartridż) — pod adresem 0x80000, w związku z czym komponenty jądra Linux zostały podzielone na dwie oddzielne przestrzenie pamięci: sekcje .rodata i .text z danymi stałymi i kodem umieszczono na kartridżu, a sekcje .data i .bss z danymi zmiennymi w pamięci RAM. Ponieważ CPU 68000 szuka tabeli wektorów przerwań pod adresem 0x0, a jądro jest faktycznie umieszczone na kartridżu, którego zawartość odwzorowano na adresie 0x80000, dodatkowo zastosowano hack kopiący wektory przerwań do RAM.

Problem z brakiem zegara w CPU Motorola 68000 został rozwiązany poprzez wykorzystanie zegarów używanych w DSP do syntezowania dźwięku. Te zegary zostały użyte do generowania przerwań, które aktywowały planista zadań. Aby wyświetlać komunikaty jądra podczas ładowania, napisano oddzielny sterownik konsoli, który wykonywał wyjście z symulacją portu szeregowego poprzez piny TXD i RXD, sterowane przez procesor DSP.

Do zbudowania komponentów przestrzeni użytkownika wykorzystano narzędzie Buildroot z poprawkami od projektu LinuxMD. Aby zaoszczędzić pamięć podczas inicjalizacji, bezpośrednio wywołano powłokę poleceń „/bin/busybox sh”, funkcja malloc w bibliotece uClibc została zastąpiona uproszczoną wersją malloc-simple, nie zachowującą dodatkowych metadanych, a zamiast pełnoprawnego bootloadera, takiego jak U-Boot, wykonano bezpośrednie przekazanie kontroli do jądra poleceniem „jmp $80000”.



Źródło: opennet.ru
Kup solidny hosting stron z ochroną przed DDoS, serwery VPS VDS 🔥 Kup solidny hosting stron z ochroną przed DDoS, serwery VPS VDS | ProHoster