Zurück zur Startseite

Portierung von Mac OS X Cheetah auf Wii: XNU und device tree

Ein Entwickler hat Mac OS X Cheetah auf Nintendo Wii portiert, unter Verwendung eines benutzerdefinierten Bootloaders basierend auf ppcskel. Schritte zum Parsen von Mach-O, Patchen von XNU für Debugging und Erstellen des device tree werden beschrieben. Das Projekt demonstriert Kompatibilität mit PowerPC 750CL und 88 MB RAM.

Mac OS X auf Wii: von Mach-O bis XNU-Debugging
Advertisement 728x90

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.

Google AdInline article slot

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:

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

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 (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

Advertisement 728x90

Weiterlesen