任天堂Wii上运行Mac OS X Cheetah:移植深度剖析
一位开发者成功在任天堂Wii上启动了原版Mac OS X Cheetah,利用其PowerPC 750CL处理器。该芯片源自iBook G3和iMac G3机型中的PowerPC 750CXe,在CPU层面提供了良好的兼容性。
Wii配备88 MB内存:24 MB 1T-SRAM(MEM1)和64 MB GDDR3(MEM2)。Cheetah官方要求128 MB,但QEMU测试证明64 MB也能正常运行。支持的关键功能包括:
- 通过USB Gecko实现串口输出;
- 从SD卡启动;
- 中断控制器;
- 视频输出至帧缓冲区;
- USB鼠标和键盘支持。
Darwin的开源XNU内核和IOKit无缝处理驱动程序。闭源部分如Quartz和Finder在内核启动后无需打补丁即可运行。
启动流程:从Open Firmware到Wii
在PowerPC Mac上,启动过程经过Open Firmware构建设备树,然后BootX加载Mach-O内核。Wii则依赖Homebrew Channel和BootMii的自制软件。
该方案使用基于ppcskel的自定义引导加载器:Wii初始化,从SD卡加载XNU,构建设备树,跳转至内核。跳过完整的Open Firmware或BootX移植,省去了多硬件支持,保持了精简。
Mach-O解析与内核启动
引导加载器解析Mach-O加载命令并映射段:
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
启动调用:((void ()())kernel_entry_point)(boot_args_address, MAC_OS_X_SIGNATURE);。屏幕变黑——内核接管。
通过打补丁调试:在0x0D8000C0处交换指令,切换Wii的LED状态:
lis r5, 0xd80
ori r5, r5, 0xc0
lwz r4, (r5)
sync
xori r4, r4, 0x20
stw r4, (r5)
Hopper反汇编器映射了XNU函数。初始化序列:
- 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 (崩溃300)
在异常300处崩溃:缺少设备树。
设备树与boot_args
设备树是硬件的层次化映射。对于Wii,从Wii Linux的硬编码版本起步,最小化配置:
/
├── cpus
│ └── PowerPC,750
└── memory
根据需要扩展。boot_args结构:
typedef struct boot_args {
u16 Revision;
u16 Version;
// ... (传递给内核的完整结构)
};
引导加载器实时修补内核以便测试。
关键要点
- Wii的PowerPC 750CL原生运行Cheetah,无需CPU修改;
- 88 MB内存足够基本启动,经QEMU验证;
- 自定义ppcskel引导加载器降低开销;
- Mach-O解析和LED打补丁开启XNU调试;
- 硬编码设备树加速固定硬件启动。
— Editorial Team
暂无评论。