Mac OS X Cheetah auf Nintendo Wii: Tiefergehender Portierungsbericht
Ein Entwickler hat es geschafft, das originale Mac OS X Cheetah auf einer Nintendo Wii mit ihrem PowerPC-750CL-Prozessor zu booten. Dieser Chip ist eine Weiterentwicklung des PowerPC 750CXe aus iBook-G3- und iMac-G3-Modellen und bietet solide Kompatibilität auf CPU-Ebene.
Die Wii verfügt über 88 MB RAM: 24 MB 1T-SRAM (MEM1) und 64 MB GDDR3 (MEM2). Cheetah verlangt offiziell 128 MB, doch QEMU-Tests haben gezeigt, dass es mit 64 MB einwandfrei läuft. Unterstützte Kernfunktionen umfassen:
- Serielle Ausgabe über USB Gecko;
- Booten von SD-Karte;
- Interrupt-Controller;
- Videoausgabe auf Framebuffer;
- USB für Maus und Tastatur.
Darwins Open-Source-XNU-Kernel und IOKit übernehmen die Treiber nahtlos. Geschlossene Komponenten wie Quartz und Finder starten ohne Patches, sobald der Kernel läuft.
Boot-Prozess: Von Open Firmware zur Wii
Bei PowerPC-Macs läuft der Boot-Prozess über Open Firmware, das den Gerätebaum aufbaut, bevor BootX den Mach-O-Kernel lädt. Die Wii setzt auf Homebrew über den Homebrew Channel und BootMii.
Der Ansatz nutzt einen angepassten ppcskel-basierten Bootloader: Wii-Init, Laden von XNU von der SD-Karte, Aufbau des Gerätebaums, Sprung zum Kernel. Das Weglassen eines vollständigen Open-Firmware- oder BootX-Ports hielt den Code schlank, indem Multi-Hardware-Unterstützung gestrichen wurde.
Mach-O-Parsing und Kernel-Start
Der Bootloader zerlegt Mach-O-Load-Befehle und ordnet Segmente zu:
0x00000000: Exception-Vektoren
0x00011000: LC_SEGMENT __TEXT
0x002e0000: LC_SEGMENT __DATA
0x00367000: LC_SEGMENT __KLD
0x00395000: LC_SEGMENT __LINKEDIT
0x00434000: LC_SEGMENT __SYMTAB
0x004d3000: LC_SEGMENT __HEADER
Startaufruf: ((void ()())kernel_entry_point)(boot_args_address, MAC_OS_X_SIGNATURE);. Der Bildschirm wird schwarz – der Kernel hat die Kontrolle.
Debugging durch Patches: Anweisungen austauschen, um die Wii-LED an 0x0D8000C0 umzuschalten:
lis r5, 0xd80
ori r5, r5, 0xc0
lwz r4, (r5)
sync
xori r4, r4, 0x20
stw r4, (r5)
Hopper-Disassembler hat XNU-Funktionen kartiert. Init-Sequenz:
- 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 (Absturz 300)
Absturz bei Exception 300: Fehlender Gerätebaum.
Gerätebaum und boot_args
Der Gerätebaum ist eine hierarchische Hardwarekarte. Für die Wii startet eine hardcodierte Version aus Wii Linux minimal:
/
├── cpus
│ └── PowerPC,750
└── memory
Erweitert nach Bedarf. Boot_args-Struktur:
typedef struct boot_args {
u16 Revision;
u16 Version;
// ... (vollständige Struktur, die an Kernel übergeben wird)
};
Bootloader patcht den Kernel on-the-fly für Tests.
Wichtige Erkenntnisse
- Wii-PowerPC-750CL läuft Cheetah stockmäßig, keine CPU-Anpassungen nötig;
- 88 MB RAM reichen für Basis-Boot, QEMU-geprüft;
- Angepasster ppcskel-Bootloader reduziert Overhead;
- Mach-O-Parsing und LED-Patches ermöglichen XNU-Debugging;
- Hardcodierter Gerätebaum beschleunigt Boot auf fester Hardware.
— Editorial Team
Noch keine Kommentare.