Zpět na domů

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

Vývojář portoval Mac OS X Cheetah na Nintendo Wii pomocí vlastního bootloaderu na bázi ppcskel. Jsou popsány kroky parsování Mach-O, patchování XNU pro ladění a vytvoření device tree. Projekt demonstruje kompatibilitu PowerPC 750CL a 88 MB RAM.

Mac OS X na Wii: od Mach-O po XNU-ladění
Advertisement 728x90

Spuštění Mac OS X Cheetah na Nintendo Wii: Technické detaily portování

Vývojář úspěšně spustil první verzi Mac OS X Cheetah na Nintendo Wii, využívající procesor PowerPC 750CL. Tento čip se vyvinul z PowerPC 750CXe, který byl použit v iBook G3 a iMac G3, což zajistilo vysokou kompatibilitu na úrovni CPU.

Wii disponuje 88 MB RAM: 24 MB 1T-SRAM (MEM1) a 64 MB GDDR3 (MEM2). Cheetah oficiálně vyžaduje 128 MB, ale testy v QEMU potvrdily funkčnost s 64 MB. Podpora zahrnuje:

  • Sériový výstup přes USB Gecko;
  • Zavedení ze SD karty;
  • Řadiče přerušení;
  • Video výstup do framebufferu;
  • USB pro myš a klávesnici.

Darwin jádro XNU je otevřené, IOKit spravuje ovladače. Uzavřené komponenty (Quartz, Finder) fungují bez úprav po zavedení jádra.

Google AdInline article slot

Zaváděcí proces: od Open Firmware k Wii

Na PowerPC Mac probíhá zavedení přes Open Firmware, které vytváří device tree, a BootX, který dekóduje Mach-O jádro. Wii využívá homebrew přes Homebrew Channel a BootMii.

Byl zvolen přístup s vlastním zavaděčem na bázi ppcskel: inicializace Wii, zavedení XNU ze SD, vytvoření device tree, volání jádra. Odmítnutí portování Open Firmware nebo BootX zjednodušilo úkol, vyloučením zbytečné podpory více hardwaru.

Parsování Mach-O a volání jádra

Zavaděč parsuje Mach-O příkazy, umisťuje 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

Volání: ((void ()())kernel_entry_point)(boot_args_address, MAC_OS_X_SIGNATURE);. Obrazovka zhasne – jádro převzalo kontrolu.

Ladění pomocí patchování: nahrazení instrukcí blikáním LED Wii na adrese 0x0D8000C0:

lis    r5, 0xd80
ori    r5, r5, 0xc0
lwz    r4, (r5)
sync
xori   r4, r4, 0x20
stw    r4, (r5)

Disassembler Hopper porovnal funkce XNU. Plán inicializace:

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)

Selhání na výjimce 300 – absence device tree.

Device tree a boot_args

Device tree – hierarchická struktura hardwaru. Pro Wii je použita hardcoded verze z Wii Linux, začínající minimem:

/
├── cpus
│   └── PowerPC,750
└── memory

Rozšíření podle potřeby. Boot_args struktura:

typedef struct boot_args {
    u16 Revision;
    u16 Version;
    // ... (úplná struktura je předána jádru)
};

Zavaděč patchuje jádro za běhu pro testy.

Co je důležité

  • PowerPC 750CL Wii je kompatibilní s Cheetah bez úprav CPU;
  • 88 MB RAM stačí pro základní zavedení, potvrzeno QEMU;
  • Vlastní zavaděč na bázi ppcskel minimalizuje režii;
  • Parsování Mach-O a LED patchování – klíčové pro ladění XNU;
  • Device tree hardcoded urychluje boot na fixním hardwaru.

— Editorial Team

Advertisement 728x90

Číst dál