返回首页

将 Mac OS X Cheetah 移植到 Wii:XNU 和 device tree

开发者使用基于 ppcskel 的自定义 bootloader 将 Mac OS X Cheetah 移植到 Nintendo Wii。描述了解析 Mach-O、修补 XNU 以进行调试以及创建 device tree 的步骤。该项目展示了与 PowerPC 750CL 和 88 MB RAM 的兼容性。

Wii 上的 Mac OS X:从 Mach-O 到 XNU 调试
Advertisement 728x90

任天堂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在内核启动后无需打补丁即可运行。

Google AdInline article slot

启动流程:从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加载命令并映射段:

Google AdInline article slot
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函数。初始化序列:

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

Advertisement 728x90

继续阅读