## 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.
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:
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:
- 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
Aún no hay comentarios.