홈으로 돌아가기

Wii로 Mac OS X Cheetah 포팅: XNU와 device tree

개발자가 ppcskel 기반 커스텀 부트로더를 사용하여 Nintendo Wii로 Mac OS X Cheetah를 포팅했습니다. Mach-O 파싱, XNU 디버깅 패칭 및 device tree 생성 단계가 설명되어 있습니다. 프로젝트는 PowerPC 750CL 및 88 MB RAM 호환성을 보여줍니다.

Wii의 Mac OS X: Mach-O부터 XNU 디버깅까지
Advertisement 728x90

닌텐도 Wii에 Mac OS X 치타 부팅: 포팅 심층 분석

한 개발자가 닌텐도 Wii의 PowerPC 750CL 프로세서를 활용해 원본 Mac OS X 치타를 성공적으로 부팅했습니다. 이 칩은 iBook G3와 iMac G3 모델에 탑재된 PowerPC 750CXe에서 발전한 버전으로, CPU 수준에서 뛰어난 호환성을 제공합니다.

Wii는 총 88MB RAM을 탑재하고 있습니다: 24MB 1T-SRAM (MEM1)64MB GDDR3 (MEM2). 치타는 공식적으로 128MB를 요구하지만, QEMU 테스트 결과 64MB로도 문제없이 실행됩니다. 지원되는 주요 기능은 다음과 같습니다:

  • 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: 예외 벡터
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);. 화면이 검게 변합니다—커널이 제어권을 잡았습니다.

패칭을 통한 디버깅: Wii의 LED를 0x0D8000C0에서 토글하도록 명령어 교체:

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이 치타를 스톡 상태로 실행, CPU 수정 불필요;
  • 88MB RAM으로 기본 부팅 충분, QEMU 검증;
  • 커스텀 ppcskel 부트로더로 오버헤드 최소화;
  • Mach-O 파싱과 LED 패칭으로 XNU 디버깅 가능;
  • 하드코딩 장치 트리로 고정 하드웨어 부팅 가속.

— Editorial Team

Advertisement 728x90

다음 읽기