Powrót do strony głównej

Port Mac OS X Cheetah na Wii: XNU i device tree

Deweloper portował Mac OS X Cheetah na Nintendo Wii, używając niestandardowego bootloadera na bazie ppcskel. Opisano kroki parsowania Mach-O, patchowania XNU dla debugowania i tworzenia device tree. Projekt demonstruje kompatybilność PowerPC 750CL i 88 MB RAM.

Mac OS X na Wii: od Mach-O do debugowania XNU
Advertisement 728x90

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.

Google AdInline article slot

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:

Google AdInline article slot
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:

Google AdInline article slot
  • 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

Advertisement 728x90

Czytaj dalej