7P by GN⁺ 20시간전 | ★ favorite | 댓글 3개
  • 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) 구조를 통해 하드웨어 계층을 표현
    • 예시: IOPCIBridgeIOPCIDeviceSomeEthernetCardIOEthernetInterface
    • 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 조작 달성
  • “불가능해 보이는 프로젝트일수록 도전할 가치가 있다”는 교훈 강조

맛있는 글에 멋있는 글쓴이네요….

덕중의 덕은 양덕이라더니..

Hacker News 의견들
  • 이 프로젝트는 정말 놀라운 작업이었음. 글 자체도 흡입력이 있어서 끝까지 몰입했음
    특히 “WindowServer가 불만을 표시했고, 이를 해결하려면 직접 framebuffer 드라이버를 작성해야 했다”는 부분이 인상적이었음
    MacOS의 I/O Kit 추상화 계층이 실제로 제 역할을 하는 걸 보고 놀랐음. NeXT 개발자들에게 박수를 보냄

    • 나도 비슷하게 느꼈음. 드라이버를 처음 써보는 입장에서 학습 곡선이 가팔랐지만, 시스템이 살아 움직이는 걸 보고 IOKit의 접근 방식을 이해하게 되었음
      다른 플랫폼의 드라이버 개발 경험이 없어서 비교는 어렵지만, 구조적으로는 꽤 매력적이었음
    • IOKit은 OS X를 위해 처음부터 새로 만들어진 것이고, NeXT 시절에는 DriverKit이라는 다른 모델을 썼다고 들었음
      예전에 NetBSD 개발자들이 Mach/IOKit 호환 계층 위에서 PPC Darwin을 구동해 Xquartz까지 띄운 적도 있었음. NetBSD가 IOKit 호출을 번역했다는 점이 흥미로움
    • Linux의 스택과도 유사한 점이 많아서, Linux on Wii 프로젝트를 살펴보며 framebuffer 문제를 어떻게 처리했는지 비교해볼 생각임
      Wii 위에서 이렇게 많은 OS가 돌아간다는 게 여전히 믿기지 않음
    • OPENSTEP 시절부터 여러 아키텍처와 운영체제를 대상으로 했던 경험이 이런 추상화에 도움이 되었을 것 같음
    • “MacOS가 얼마나 잘 추상화되어 있는지 놀랍다”는 말에 공감함
      사실 좋은 추상화와 나쁜 추상화의 차이는 얼마나 잘 설명되었는가에 달려 있음
  • 엔지니어링 자체도 대단하지만, 작성자가 이코노미석에서 개발을 하고 있었다는 점이 진짜 인상적이었음

    • 나로선 이코노미석에서 노트북을 제대로 쓰는 것도 힘든데, Wii까지 연결해서 디버깅했다니 믿기지 않음
    • 예전에 Apple이 비행기 안에서 편집하는 광고를 만든 적이 있었음 (유튜브 링크)
    • 옆자리 사람은 아마 “저건 뭐지?” 하며 휴대폰만 보고 있었을 듯함. 나였으면 참지 못하고 물어봤을 것 같음
    • 사진을 보니 버스 같기도 하고 비행기 같기도 했음. 어쨌든 이동 중에 Wii를 들고 개발했다는 건 엄청난 집중력과 헌신의 증거임
      (추가로 보니 첫 사진은 버스, 두 번째는 비행기였음)
    • 이동 중에 이런 복잡한 프로젝트에 몰입할 수 있다는 게 놀라움. 사진을 다시 봤는데 기차나 버스 같기도 함. 어쨌든 대단한 플렉스임
  • 나는 NetBSD Wii 및 Wii U 포트의 작성자로서, 이 프로젝트에 진심으로 축하를 보냄
    앞으로 어떤 문제를 어떻게 해결했는지 보는 게 기대됨

    • 당신의 포트가 큰 영감을 주었음. 이 분야에 많은 기여를 해줘서 고마움
  • 예전엔 나도 하드코어한 Mac 매니아였고, 역공학으로 초창기 비공식 “iOS 앱”을 만든 적도 있었음
    하지만 이번 프로젝트는 그 모든 걸 뛰어넘음. Wii에서 MacOS를 돌린 것도 놀랍지만, 글 자체가 너무 정교하고 흥미로움

    • 따뜻한 말 고마움 :)
  • Wii의 RAM이 88MB뿐이라는 사실을 처음 알았음. 게임들이 전자 기반이 아니라서 다행이었음

    • 흥미로운 역사적 사실인데, Wii가 출시된 같은 달에 Windows Vista도 북미에서 나왔음
      Vista 최소 요구 사양이 512MB였는데, 대부분의 PC가 그보다 적은 메모리를 가지고 있었음
      요즘은 8GB가 줄고 16GB가 표준이 되어가는 걸 보면 세상이 많이 변했음
    • Wii 설정 메뉴가 HTML 웹페이지로 되어 있었다는 사실이 웃김. 2006년 콘솔도 웹의 손아귀를 피하지 못했음
  • 프로젝트를 시작하기 전에 “이게 가능하기나 한가?”를 확인했는데, 2021년 Reddit 댓글에 “0% 가능성”이라는 말이 있었음
    그걸 보고 오히려 동기부여가 되었음. 그래서 Wii의 하드웨어를 분석하며 시작했음. 진짜 웃겼음

    • 이런 프로젝트의 가치는 이런 “절대 불가능” 발언을 영원히 박제하는 데 있음
      사람들은 ‘거의 불가능한 일’을 절대 일어나지 않을 거라 단정하면서 자신이 원칙적인 회의론자라고 착각함
    • 예전 Linux 농담이 생각남. “Linux에서 X를 어떻게 하나요?”라고 묻지 말고 “Linux에서는 X가 불가능하다”고 말하면 누군가 바로 방법을 보여줬다는 이야기였음
    • 나도 Adafruit의 MacroPad 문서에서 “BLE나 WiFi는 추가할 수 없다”는 문장을 보고 프로젝트를 시작했음
      “정말 그래?” 하며 UART 포트를 재구성해 ESP32를 붙였음
    • “모든 게 마젠타색이다”라는 디버깅 장면도 재밌었음
    • 많은 인터넷 댓글러들이 이런 식으로 냉소를 지적임으로 착각
      무지한 냉소라는 개념이 없다는 게 문제임
  • Wii에서 커널 패닉을 디버깅하면서 비행기 이코노미석에 앉아 있었다니, 그 집중력의 수준은 상상도 안 됨
    대부분은 비행기에서 책 한 권 읽기도 힘든데 말임

  • 정말 멋진 프로젝트였음. 예전 저수준 개발의 황금기가 떠오름
    예전엔 VGA 초기화하고 픽셀을 찍는 게 쉬웠고, 6502 같은 칩도 접근성이 높았음
    하지만 요즘은 시스템이 너무 복잡해져서 진입 장벽이 높아졌음
    게다가 AI가 오히려 개발을 단순화시키는 척하면서 접근성을 더 떨어뜨리고 있음

  • 나도 비슷하게 Mac OS 9을 Wii U에 포팅하려고 시도 중임
    이 프로젝트를 보고 완전히 감명받았고, “불가능하다”는 생각이 들 때마다 다시 용기를 얻음

    • 정말 멋짐. Mac OS 9은 폐쇄형 소스라서 더 어려운 도전일 듯함
    • XNU나 Darwin 소스가 없다는 게 불리하지만, System 7.1 유출 소스, Ghidra, MCP 같은 도구로 보완할 수 있을 것임. 행운을 빔
  • 글도 훌륭했지만, .mov 영상을 <video> 태그로 넣은 건 브라우저 호환성 문제가 있음
    Chrome이나 Firefox에서는 재생되지 않음

    • Chrome과 Firefox에서 안 된다면, 사실상 거의 모든 브라우저에서 안 된다고 봐야 함
    • 고마움! 이미 수정했음