Uruchomienie Mac OS X Cheetah na Nintendo Wii: techniczne szczegóły portowania
Deweloper pomyślnie uruchomił pierwszą wersję Mac OS X Cheetah na Nintendo Wii, wykorzystując procesor PowerPC 750CL. Ten chip wyewoluował z PowerPC 750CXe, stosowanego w iBook G3 i iMac G3, co zapewniło wysoką kompatybilność na poziomie CPU.
Wii posiada 88 MB RAM: 24 MB 1T-SRAM (MEM1) i 64 MB GDDR3 (MEM2). Cheetah oficjalnie wymaga 128 MB, ale testy w QEMU potwierdziły funkcjonalność z 64 MB. Obsługa obejmuje:
- Seryjne wyjście przez USB Gecko;
- Ładowanie z karty SD;
- Kontrolery przerwań;
- Wyjście wideo do framebuffera;
- USB dla myszy i klawiatury.
Jądro Darwin XNU jest otwarte, IOKit zarządza sterownikami. Zamknięte komponenty (Quartz, Finder) działają bez poprawek po uruchomieniu jądra.
Proces uruchamiania: od Open Firmware do Wii
Na PowerPC Mac uruchamianie odbywa się przez Open Firmware, które buduje device tree, i BootX, który dekoduje kernel Mach-O. Wii wykorzystuje homebrew przez Homebrew Channel i BootMii.
Wybrano podejście z customowym bootloaderem opartym na ppcskel: inicjalizacja Wii, ładowanie XNU z SD, tworzenie device tree, wywołanie jądra. Rezygnacja z portowania Open Firmware lub BootX uprościła zadanie, eliminując niepotrzebne wsparcie dla wielu urządzeń.
Rozbiór Mach-O i wywołanie jądra
Bootloader analizuje komendy Mach-O, umieszczając segmenty:
0x00000000: Exception vectors
0x00011000: LC_SEGMENT __TEXT
0x002e0000: LC_SEGMENT __DATA
0x00367000: LC_SEGMENT __KLD
0x00395000: LC_SEGMENT __LINKEDIT
0x00434000: LC_SEGMENT __SYMTAB
0x004d3000: LC_SEGMENT __HEADER
Wywołanie: ((void ()())kernel_entry_point)(boot_args_address, MAC_OS_X_SIGNATURE);. Ekran gaśnie — jądro przejęło kontrolę.
Debugowanie przez patchowanie: zamiana instrukcji na miganie LED Wii pod adresem 0x0D8000C0:
lis r5, 0xd80
ori r5, r5, 0xc0
lwz r4, (r5)
sync
xori r4, r4, 0x20
stw r4, (r5)
Disassembler Hopper dopasował funkcje XNU. Plan inicjalizacji:
- start.s: start
- start.s: allStart
- start.s: nextPVR
- start.s: donePVR
- start.s: doOurInit
- start.s: noFloat
- start.s: noVector
- start.s: noSMP
- start.s: noThermometer
- ppc_init.c: ppcInit
- pe_init.c: PE_INIT_PLATFORM
- device_tree.c: find_entry (crash 300)
Awaria na wyjątku 300 — brak device tree.
Device tree i boot_args
Device tree — hierarchiczna struktura sprzętu. Dla Wii hardcodowana wersja z Wii Linux, zaczynając od minimum:
/
├── cpus
│ └── PowerPC,750
└── memory
Rozszerzanie w miarę potrzeb. Struktura boot_args:
typedef struct boot_args {
u16 Revision;
u16 Version;
// ... (pełna struktura przekazywana jest do jądra)
};
Bootloader patchuje jądro w locie do testów.
Co jest ważne
- Procesor PowerPC 750CL w Wii jest kompatybilny z Cheetah bez modyfikacji CPU;
- 88 MB RAM wystarcza do podstawowego uruchomienia, potwierdzone przez QEMU;
- Customowy bootloader oparty na ppcskel minimalizuje overhead;
- Parsowanie Mach-O i patchowanie LED — kluczowe dla debugowania XNU;
- Hardcodowany device tree przyspiesza uruchamianie na stałym sprzęcie.
— Editorial Team
Brak komentarzy.