Volver al inicio

Portar Mac OS X Cheetah a Wii: XNU y árbol de dispositivos

Un desarrollador portó Mac OS X Cheetah a Nintendo Wii usando un cargador de arranque personalizado basado en ppcskel. Se describen los pasos para analizar Mach-O, parchear XNU para depuración y crear árbol de dispositivos. El proyecto demuestra compatibilidad con PowerPC 750CL y 88 MB de RAM.

Mac OS X en Wii: desde Mach-O hasta depuración de XNU
Advertisement 728x90

## Ejecutar Mac OS X Cheetah en Nintendo Wii: Análisis profundo del port

Un desarrollador ha logrado arrancar el original Mac OS X Cheetah en una Nintendo Wii utilizando su procesador PowerPC 750CL. Este chip es una evolución del PowerPC 750CXe presente en modelos como iBook G3 e iMac G3, lo que proporciona una sólida compatibilidad a nivel de CPU.

La Wii cuenta con 88 MB de RAM: 24 MB 1T-SRAM (MEM1) y 64 MB GDDR3 (MEM2). Cheetah requiere oficialmente 128 MB, pero pruebas con QEMU demostraron que funciona perfectamente con 64 MB. Las funciones clave soportadas incluyen:

  • Salida serial vía USB Gecko;
  • Arranque desde tarjeta SD;
  • Controladores de interrupciones;
  • Salida de video al framebuffer;
  • USB para ratón y teclado.

El kernel de código abierto XNU de Darwin y IOKit gestionan los drivers sin problemas. Componentes propietarios como Quartz y Finder se inician sin parches una vez que el kernel está en marcha.

Google AdInline article slot

Proceso de arranque: De Open Firmware a Wii

En los Mac con PowerPC, el arranque pasa por Open Firmware, que construye el árbol de dispositivos, y luego BootX carga el kernel Mach-O. La Wii depende del homebrew a través del Homebrew Channel y BootMii.

El enfoque utiliza un cargador de arranque personalizado basado en ppcskel: inicialización de Wii, carga de XNU desde SD, construcción del árbol de dispositivos y salto al kernel. Omitir un port completo de Open Firmware o BootX mantuvo todo ligero al eliminar el soporte para múltiples hardwares.

Análisis de Mach-O y lanzamiento del kernel

El cargador descompone los comandos de carga Mach-O y mapea los segmentos:

Google AdInline article slot
0x00000000: Vectores de excepciones
0x00011000: LC_SEGMENT __TEXT
0x002e0000: LC_SEGMENT __DATA
0x00367000: LC_SEGMENT __KLD
0x00395000: LC_SEGMENT __LINKEDIT
0x00434000: LC_SEGMENT __SYMTAB
0x004d3000: LC_SEGMENT __HEADER

Llamada de lanzamiento: ((void ()())kernel_entry_point)(boot_args_address, MAC_OS_X_SIGNATURE);. La pantalla se pone en negro: el kernel toma el control.

Depuración mediante parches: Intercambio de instrucciones para alternar el LED de la Wii en 0x0D8000C0:

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

El desensamblador Hopper mapeó las funciones de XNU. Secuencia de inicialización:

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 (fallo 300)

Fallo en la excepción 300: falta el árbol de dispositivos.

Árbol de dispositivos y boot_args

El árbol de dispositivos es un mapa jerárquico del hardware. Para la Wii, una versión hardcodeada de Wii Linux inicia lo mínimo:

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

Se expande según sea necesario. Estructura de boot_args:

typedef struct boot_args {
    u16 Revision;
    u16 Version;
    // ... (estructura completa pasada al kernel)
};

El cargador parchea el kernel sobre la marcha para pruebas.

Lecciones clave

  • El PowerPC 750CL de la Wii ejecuta Cheetah sin modificaciones en la CPU;
  • 88 MB de RAM bastan para un arranque básico, verificado con QEMU;
  • Cargador ppcskel personalizado reduce el overhead;
  • Análisis de Mach-O y parches de LED desbloquean la depuración de XNU;
  • Árbol de dispositivos hardcodeado acelera el arranque en hardware fijo.

— Editorial Team

Advertisement 728x90

Leer después