닌텐도 Wii에서 Mac OS X 10.0(Cheetah) 구동 성공

2 days ago 2
  • Wii의 PowerPC 기반 하드웨어를 이용해 Mac OS X 10.0(Cheetah) 을 네이티브로 실행하는 포팅 프로젝트 완성
  • Darwin/XNU 커널을 Wii에 맞게 수정하고, 부트로더·디바이스 트리·드라이버를 직접 작성해 GUI 환경까지 부팅에 성공
  • SD 카드·프레임버퍼·USB 입력 장치를 지원하는 커스텀 IOKit 드라이버를 구현해 완전한 시스템 동작을 달성
  • BAT 설정 충돌 수정, Hollywood SoC용 드라이버 계층 구축, RGB→YUV 변환 프레임버퍼 등 Wii 특유의 구조를 반영
  • 10여 년간의 시도 끝에 Wii에서 Mac OS X 완전 부팅 및 조작을 실현하며, 불가능해 보이는 프로젝트의 도전 가치를 입증함

Wii에서 Mac OS X 실행 프로젝트 개요

  • Mac OS X 10.0 (Cheetah)Nintendo Wii에서 네이티브로 실행하기 위한 포팅 프로젝트 진행
  • Wii는 이미 Linux, NetBSD, Windows NT 등의 OS 포팅 사례가 있었으며, 이번에 Mac OS X이 추가됨
  • Wii의 PowerPC 기반 하드웨어를 활용해 Darwin/XNU 커널을 구동하고, 필요한 드라이버와 부트로더를 직접 작성
  • 결과적으로 Wii에서 Mac OS X GUI 환경까지 완전 부팅에 성공, 키보드·마우스 입력까지 지원

실행 가능성 조사

  • Wii의 PowerPC 750CL CPU는 G3 iMac/iBook에 사용된 PowerPC 750CXe의 후속으로 CPU 호환성 문제 없음
  • Wii의 88MB RAM(MEM1 24MB + MEM2 64MB)은 공식 요구사양(128MB)보다 적지만, QEMU 테스트로 64MB에서도 부팅 가능 확인
  • 지원 하드웨어는 USB Gecko(시리얼 디버깅), SD 카드, 인터럽트 컨트롤러, 프레임버퍼 비디오 출력, USB 포트
  • Mac OS X의 오픈소스 코어 Darwin(XNU 커널, IOKit) 을 Wii에 맞게 수정하면 상위 GUI 계층도 동작 가능
  • Wii는 Homebrew ChannelBootMii를 통해 자체 코드 실행이 가능해 포팅 실험에 적합

포팅 접근 방식

  • 세 가지 부팅 전략 중 선택:
    1. Open Firmware 포팅
    2. BootX 포팅
    3. 커스텀 부트로더 직접 작성
  • Wii 전용 부트로더를 새로 작성해 하드웨어 초기화, 커널 로드, 디바이스 트리 생성, 커널 제어 이양 수행
  • 커널 실행 후에는 부트로더 코드가 불필요해지고, 이후 단계는 커널 패치 및 드라이버 작성 중심으로 진행

부트로더 작성

  • ppcskel 예제 코드를 기반으로 Wii 초기화 및 SD 카드·프레임버퍼·USB 디버깅 기능 구현
  • Mach-O 포맷의 XNU 커널을 메모리에 로드하고 지정된 엔트리 포인트로 점프해 실행
  • 커널 실행 여부 확인을 위해 LED 점멸 패치를 삽입해 커널 진입 단계 추적
  • 커널 실행 경로를 역추적해 device_tree.c 단계에서 300 예외 발생 확인 → 디바이스 트리 전달 필요성 인식
  • 디바이스 트리 생성 및 전달

    • Wii의 고정 하드웨어 구조를 기반으로 하드코딩된 최소 트리 구성 (/cpus, /memory)
    • boot_args 구조체에 디바이스 트리 포인터를 포함시켜 커널에 전달
    • 이후 커널이 정상적으로 트리를 인식하며 부팅 진행

커널 패치

  • XNU의 BAT(Block Address Translation) 설정이 Wii 메모리 맵과 충돌해 커널 소스 수정 필요
  • Mac OS X Cheetah 게스트(QEMU) 환경에서 커널 빌드 시스템 구성
  • BAT 수정USB Gecko 콘솔 출력 리다이렉션 추가로 디버깅 가능
  • 이후 가상 메모리, IOKit, BSD 서브시스템이 정상 초기화됨
  • 부팅 로그에서 “Still waiting for root device” 메시지 발생 → SD 카드 드라이버 필요성 확인

드라이버 작성

  • IOKit 구조 이해

    • IOKit은 C++ 기반 커널 확장 프레임워크로, 드라이버-넙(nub) 구조를 통해 하드웨어 계층을 표현
    • 예시: IOPCIBridge → IOPCIDevice → SomeEthernetCard → IOEthernetInterface
    • Wii는 PCI 버스가 아닌 SoC(Hollywood) 구조를 사용하므로, IOPCIFamily를 대체할 커스텀 드라이버 필요
  • Hollywood 드라이버

    • NintendoWiiHollywood 드라이버 작성, 디바이스 트리의 “hollywood” 노드와 매칭
    • 하위 하드웨어를 표현하는 NintendoWiiHollywoodDevice 넙을 생성·등록
    • 이를 통해 SD 카드 등 하위 장치 드라이버가 연결 가능
  • SD 카드 드라이버

    • IOBlockStorageDevice를 상속해 Wii SD 카드 접근 구현
    • MINI(Starlet 코프로세서)IPC 명령(IPC_SDMMC_SIZE, READ, WRITE)을 이용해 SD 카드와 통신
    • 캐시된 메모리 문제 해결을 위해 비캐시 메모리 버퍼 사용
    • 성공적으로 IOMedia 넙이 생성되어 루트 파일시스템 인식 및 완전 부팅 가능
    • 부팅 로그에서 BSD root: disk0s4 확인
  • 프레임버퍼 드라이버

    • IOFramebuffer를 상속해 Wii의 MEM1 영역(0x01700000) 을 프레임버퍼로 지정
    • 초기 텍스트 콘솔과 GUI 전환을 위해 isConsoleDevice()를 true로 반환
    • Wii의 비디오 하드웨어는 YUV 포맷을 사용하므로, RGB→YUV 변환용 이중 프레임버퍼 구현
    • 변환 루프를 통해 60Hz로 색상 변환 수행 → 정상 색상 GUI 출력 성공
  • USB 입력 지원

    • Wii의 OHCI USB 1.1 컨트롤러를 구동하기 위해 AppleUSBOHCI 사용 시도
    • 문제 1: IOUSBFamily 소스 부재로 디버깅 불가
    • 문제 2: IOPCIDevice 의존성으로 Wii용 가짜 NintendoWiiHollywoodPCIDevice 작성
    • 문제 3: 엔디언 불일치(Wii는 reversed-little-endian)로 소프트웨어 바이트스왑 제거 필요
    • IRC를 통해 Mac OS X Cheetah용 IOUSBFamily 소스 확보 후 수정·빌드 성공
    • 결과적으로 USB 키보드·마우스 입력 작동, Wii가 완전한 Mac OS X 시스템으로 동작

부트로더 및 커널 개선

  • 부트로더 개선

    • SD 카드 파티션 탐색 및 부팅 메뉴 추가, Apple Partition Map(APM) 파싱 구현
    • 커널 확장(kext) 을 부트로더에서 로드해 /chosen/memory-map 노드에 등록
    • 이를 통해 수정되지 않은 Mac OS X 설치 이미지로 부팅 가능
  • 커널 단순화

    • Wii 전용 커널 수정 사항 최소화:
    • BAT 설정 수정
    • “hollywood” 노드 기반 I/O 주소 인식
    • 프레임버퍼 캐시 일관성 수정
    • 드라이버를 커널 외부로 분리해 빌드 효율 및 유지보수성 향상

마무리

  • 2013년 대학 시절 구상했던 프로젝트를 10여 년 만에 완성
  • Windows NT Wii 포팅 사례에서 영감을 받아 도전
  • 결과적으로 Wii에서 Mac OS X 10.0 완전 부팅 및 GUI 조작 달성
  • “불가능해 보이는 프로젝트일수록 도전할 가치가 있다”는 교훈 강조
Read Entire Article